2016-04-06 8 views
0

Vielleicht kann jemand hier mir helfen/einen Tipp geben, wie man etwas tut. Wir verwenden 2 Tabellen in mySql, beide MyISAM, utf8. Die erste Tabelle enthält alle Registrierungen für Objekte, die zweite Tabelle enthält alle Objekte mit zusätzlichen Informationen wie Name usw.MySQL bestellen auf Spalte von links beitreten

Die Übereinstimmung zwischen Tabelle 1 und Tabelle2 basiert auf der Code-Spalte aus beiden Tabellen. Warum nicht ID? Da table1 von einem externen System gefüllt wird, kennt es die ID des Objekts, mit dem es verknüpft ist, nicht. Außerdem können wir Anmeldungen für Objekte, die in der Tabelle nicht verfügbar sind 2, jedoch muss registriert werden in Tabelle 1

Tabelle 1 - Anmeldungen: (+/- 33.000.000 Zeilen)

+-------------+ 
| id   | 
| code  | 
| datetime | 
+-------------+ 

Table2 - Objekte: (+/- 55,000 Zeilen)

+-------------+ 
| id   | 
| code  | 
| name  | 
| description | 
| etc.  | 
+-------------+ 

Beide Tabellen hat Indizes auf einige Spalten. Die normale Auswahlabfrage funktioniert einwandfrei. Es erzeugt ein Ergebnis von 32.382.742 Zeilen in 0,0017 Sekunden.

SELECT * FROM table1 LEFT JOIN table2 on table2.code = table1.code 

Wenn ich auf Spalten aus Tabelle 1 bestelle, immer noch ok. Es erzeugt ein Ergebnis von 32.382.742 Zeilen in 0,0179 Sekunden.

Wenn ich auf Spalten von Tabelle 2 bestelle, ist es sehr schlecht. MySQL SHOW processlist; zeigt eine temporäre Tabelle erstellt wird und nicht für 300 Sekunden gestoppt, so dass wir MySQL getötet.

Auch versucht, aus Tabelle2 mit einem richtigen Join auf Tabelle 1 auszuwählen, aber das wird auch nicht funktionieren.

Wie löst man das/schnell?

Antwort

0

Sie verwenden LEFT JOIN, so dass das DBMS die Zeilen mit den Standardwerten für die Spalten von Tabelle2 NULL anordnet. Nicht sicher, ob dies etwas mit Ihrem Problem zu tun, aber Sie könnten versuchen, Ihre ORDER BY Klausel wie folgt

SELECT * 
FROM table1 LEFT JOIN table2 on table2.code = table1.code 
ORDER BY table2.name, table1.datetime 

oder (nicht sicher, ob dies funktionieren wird), die sich

SELECT * 
FROM table1 LEFT JOIN table2 on table2.code = table1.code 
ORDER BY ISNULL(table2.name,table1.datetime) 
0

Try Below Abfrage:

Select * from 
(SELECT * FROM user_product ORDER BY user_product.user_product_id DESC) as tempPost 
LEFT JOIN product_like on (product_like.user_product_id = tempPost.user_product_id)