2014-04-23 34 views
6

Esiste una differenza tra il piano di esecuzione Query MySQL e MariaDB?Differenza tra MySQL e MariaDB Piano di esecuzione delle query

Se sì, qual è il migliore?

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`) 
); 

In Maria DB,

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) 

In MySQL,

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

Quello che produce risultati corretti è migliore. Altrimenti, usare queste tabelle semplici e sciocche con quasi nessun dato è semplicemente inutile come metodo di test. –

risposta

2

Stai vedendo l'effetto di ottimizzazione (piano di MySQL "eliminazione Table" ha 4 righe, mentre uno ha MariaDB solo 3). Il piano MariaDB dovrebbe essere il migliore in quanto vi è "meno lavoro da fare". Entrambi dovrebbero restituire gli stessi risultati però.

La caratteristica è spiegata in dettaglio qui:

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

e qui:

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

Se si desidera MariaDB di utilizzare lo stesso piano di MySQL è possibile applicare questo disabilitando l'ottimizzazione dell'eliminazione della tabella con:

SET optimizer_switch='table_elimination=off';