2014-04-23 16 views
6

MySQL ve MariaDB Sorgu yürütme planı arasında fark var mı?MySQL ve MariaDB Sorgulama planı arasındaki fark

Evet, hangisi daha iyi? Maria DB ise

CREATE TABLE `Table1` (
    `ID` int(11) NOT NULL, 
    KEY `ID` (`ID`) 
); 

CREATE TABLE `Table2` (
    `ID` int(11) NOT NULL, 
    KEY `ID` (`ID`) 
); 

CREATE TABLE `Table3` (
    `ID` int(11) NOT NULL, 
    PRIMARY KEY (`ID`) 
); 

, MySQL

MariaDB [truepay_psr]> explain select T1.ID FROM Table1 T1 LEFT JOIN (SELECT T1.ID FROM Table3 T1 LEFT JOIN Table2 T2 ON T1.ID = T2.ID WHERE T2.ID IS NULL) T2 ON T1.ID=T2.ID WHERE T2.ID IS NULL; 
+------+-------------+-------+--------+---------------+---------+---------+-------------------+------+--------------------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref    | rows | Extra     | 
+------+-------------+-------+--------+---------------+---------+---------+-------------------+------+--------------------------+ 
| 1 | SIMPLE  | T1 | index | NULL   | ID  | 4  | NULL    | 1 | Using index    | 
| 1 | SIMPLE  | T1 | eq_ref | PRIMARY  | PRIMARY | 4  | truepay_psr.T1.ID | 1 | Using where; Using index | 
| 1 | SIMPLE  | T2 | ref | ID   | ID  | 4  | truepay_psr.T1.ID | 1 | Using where; Using index | 
+------+-------------+-------+--------+---------------+---------+---------+-------------------+------+--------------------------+ 
3 rows in set (0.01 sec) 

,

mysql> explain select T1.ID FROM Table1 T1 LEFT JOIN (SELECT T1.ID FROM Table3 T1 LEFT JOIN Table2 T2 ON T1.ID = T2.ID WHERE T2.ID IS NULL) T2 ON T1.ID=T2.ID WHERE T2.ID IS NULL; 
+----+-------------+------------+--------+---------------+---------+---------+------------+------+--------------------------------------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows | Extra        | 
+----+-------------+------------+--------+---------------+---------+---------+------------+------+--------------------------------------+ 
| 1 | PRIMARY  | <derived2> | system | NULL   | NULL | NULL | NULL  | 0 | const row not found     | 
| 1 | PRIMARY  | T1   | index | NULL   | ID  | 4  | NULL  | 1 | Using index       | 
| 2 | DERIVED  | T1   | index | NULL   | PRIMARY | 4  | NULL  | 1 | Using index       | 
| 2 | DERIVED  | T2   | ref | ID   | ID  | 4  | test.T1.ID | 1 | Using where; Using index; Not exists | 
+----+-------------+------------+--------+---------------+---------+---------+------------+------+--------------------------------------+ 
4 rows in set (0.00 sec) 
+1

Doğru sonuçlar verenlerden biri daha iyidir. Aksi takdirde, neredeyse hiç veri olmadan bu aptalca basit tabloları kullanarak sadece test yöntemi olarak yararsızdır. –

cevap

2

Sen "Masa eleme" optimizasyonu (MySQL planının etkisini 4 satır mariadb biri sahipken vardır görüyoruz sadece 3). MariaDB planı, yapılacak daha az iş olduğu kadar iyi olmalıydı. Her ikisi de aynı sonuçları döndürmeli. Burada

http://s.petrunia.net/blog/?p=58

ve:

özellik burada ayrıntılı olarak açıklanmıştır

https://mariadb.com/kb/en/mariadb/documentation/optimization-and-tuning/query-optimizations/table-elimination/

Eğer mariadb Eğer devre dışı bırakarak bu zorlayabilir MySQL ile aynı planı kullanmak isterseniz Tablo eleme optimizasyonu:

SET optimizer_switch='table_elimination=off';