2016-05-24 15 views
1

Ich bin ziemlich neu zu MySQL. Ich habe 2 identische mysql-Tabellen, die jeweils 50K Zeilen (70 Spalten) haben. Diese Tabellen werden jeden Tag durch einen Datafeed aktualisiert. Ich muss einige verschachtelte Abfragen wie Kreuzungen/Subtraktionen etc. ausführen.Mysql Kreuzung Abfrage Leistung

Eine der Abfragen, die ich versuche zu verwenden, ist wie folgt. Aber es funktioniert nicht richtig. Entweder dauert es 5 Minuten. bis 10 Minuten (durch Terminal) oder es antwortet nicht zurück.

SELECT * 
FROM table1 
WHERE table1.sku IN (SELECT t1.sku 
         FROM ((SELECT DISTINCT sku 
           FROM table2) 
           UNION ALL 
           (SELECT DISTINCT sku 
           FROM table1)) AS t1 
         GROUP BY sku 
         HAVING Count(*) >= 2) 

Wie kann ich es schneller arbeiten/richtig? Wie sollte ich die Tabellen/Spalten konfigurieren (Index, Primärschlüssel usw.) Oder muss ich den mysql Server anpassen?

Ich habe mehrere Dinge ausprobiert. Ich habe Indizes auf dem 'sku' erstellt, die varchar (75) Spalten sind. Mein Datenbankserver läuft auf einem 1 CoreProcessor (Digital Ocean) Server mit 512 MB Speicher.

--- Abfrage mit ‚erklären‘

+----+--------------------+-----------------------+-------+---------------+---------+---------+------+-------+---------------------------------+ 
| id | select_type  | table     | type | possible_keys | key  | key_len | ref | rows | Extra       | 
+----+--------------------+-----------------------+-------+---------------+---------+---------+------+-------+---------------------------------+ 
| 1 | PRIMARY   | table1    | ALL | NULL   | NULL | NULL | NULL | 30260 | Using where      | 
| 2 | DEPENDENT SUBQUERY | <derived3>   | ALL | NULL   | NULL | NULL | NULL | 65677 | Using temporary; Using filesort | 
| 3 | DERIVED   | table2    | range | NULL   | sku_idx | 227  | NULL | 31016 | Using index for group-by  | 
| 4 | UNION    | table1    | range | NULL   | sku  | 227  | NULL | 30261 | Using index for group-by  | 
| NULL | UNION RESULT  | <union3,4>   | ALL | NULL   | NULL | NULL | NULL | NULL |         | 
+----+--------------------+-----------------------+-------+---------------+---------+---------+------+-------+---------------------------------+ 

Antwort

0

Wenn ich diese bestimmte Abfrage richtig verstehe, Sie versuchen, aus table1 alle Datensätze angezeigt werden, die einen entsprechenden sku in table2 haben.

, die durch eine viel einfachere Abfrage erreicht werden kann:

SELECT * 
FROM table1 
WHERE table1.sku IN (SELECT DISTINCT table2.sku FROM table2) 
GROUP BY table1.sku 

Oder mit verbindet:

SELECT table1.* 
FROM table1 
INNER JOIN table2 ON table1.sku = table2.sku 
GROUP BY table1.sku 

Dieses in einem Augenblick arbeiten sollten, wenn Sie Indizes für table1.sku und table2.sku

+0

haben Vielen Dank @Tudor –