2017-04-07 4 views
0

einfache Abfrage:einfache Abfrage: mysql - sehr langsam, MariaDB - gute Leistung

select * 
from data.staff AS staff 
left join data.contact AS workphones on staff.id = workphones.staff_with_work_phone_id 

Mysql Zeit laufen: 5,3 sek.
MariaDb Laufzeit: 0,016 sek.

Kontakt hat ~ 50000 Reihen.
Das Personal hat ~ 600 Reihen.

Was ist der Grund?
Ist es möglich, das gleiche Ergebnis auf mysql zu erreichen?

Vielen Dank!

Erklären MySql (v5.7.14):

+----+-------------+------------+------------+------+--------------------------------+------+---------+------+-------+----------+---------------------------------------+ 
| id | select_type | table  | partitions | type | possible_keys     | key | key_len | ref | rows | filtered | Extra         | 
+----+-------------+------------+------------+------+--------------------------------+------+---------+------+-------+----------+---------------------------------------+ 
| 1 | SIMPLE  | staff  | NULL  | ALL | NULL       | NULL | NULL | NULL | 606 | 100.00 | NULL         | 
+----+-------------+------------+------------+------+--------------------------------+------+---------+------+-------+----------+---------------------------------------+ 
| 2 | SIMPLE  | workphones | NULL  | ALL | FK_2f7824065c2c4b0fbe5c00da271 | NULL | NULL | NULL | 49180 | 100.00 | Using where.       | 
| |    |   |   |  |        |  |   |  |  |   | Using join buffer (Block Nested Loop) | 
+----+-------------+------------+------------+------+--------------------------------+------+---------+------+-------+----------+---------------------------------------+ 

MariaDB Erklären (v10.0.28):

+----+-------------+------------+------+--------------------------------+--------------------------------+---------+--------------------+-------+----------+-------+ 
| id | select_type | table  | type | possible_keys     | key       | key_len | ref    | rows | filtered | Extra | 
+----+-------------+------------+------+--------------------------------+--------------------------------+---------+--------------------+-------+----------+-------+ 
| 1 | SIMPLE  | staff  | ALL |        |        |   |     | 602 | 100.00 |  | 
+----+-------------+------------+------+--------------------------------+--------------------------------+---------+--------------------+-------+----------+-------+ 
| 2 | SIMPLE  | workphones | ALL | FK_1249f6bc1d68495090691f3ce02 | FK_1249f6bc1d68495090691f3ce02 | 9  | user_data.staff.id | 25476 | 100.00 |  | 
+----+-------------+------------+------+--------------------------------+--------------------------------+---------+--------------------+-------+----------+-------+ 

Der Rest der Verifikationsbedingungen identisch sind. Der Test wurde viele Male durchgeführt.

+1

Welche Versionen dieser Datenbanken? Sind beide richtig abgestimmt? Gleiche Hardware? Haben Sie den Test mehrmals ausgeführt, um sicherzustellen, dass der Cache warmgelaufen ist? Sind die Server beide leer? – tadman

+0

zeigen Sie die ** EXPLAIN ** aus der Abfrage von beiden Server –

+0

Ich brauche Informationen hinzufügen. – Vladimir

Antwort

1

Ihre beiden Abfragepläne zeigen Ihnen, warum MySQL langsamer ist. Beide finden die möglichen Schlüssel, die ein Fremdschlüssel sind.

MariaDB das FK USE: FK_1249f6bc1d68495090691f3ce02 in beiden Spalten ist possible_keys UND keys in Reihe 2.

MySQL die FK nicht sehen, sie aber nicht verwenden. MySQL sagt Ihnen, dass es eine

beitreten Mit Puffer (Block Nested Loop) verwenden

in der EXTRA Tabelle.

MySQL verwendet Ihren Fremdschlüssel nicht.

Fremdschlüssel Joins Haben Sie in beiden Datenbanksystemen einen Index für Ihren Fremdschlüssel? Wenn nur MariaDB es hat, dann kann man MySQL nicht beschuldigen, weil es nicht nutzen kann, was es nicht hat.