2014-04-23 4 views
6

MySQL과 MariaDB 쿼리 실행 계획간에 차이가 있습니까?MySQL과 MariaDB의 차이 쿼리 실행 계획

예인 경우 어떤 사람이 더 낫습니까? 마리아 DB에서

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

정확한 결과가 나오는 것이 좋습니다. 그렇지 않으면 데이터가 거의없는이 어리석은 간단한 테이블을 사용하면 테스트 방법으로는 쓸모가 없다. –

답변

2

당신은 "테이블 제거"최적화 (MySQL의 계획의 효과 4 행 MariaDB의 하나가 동안을이를보고있다 단지 3). MariaDB 계획은 "할 일이 적어"더 좋은 계획이어야합니다. 두 가지 모두 동일한 결과를 반환해야합니다. 여기

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

과 :

기능은 여기에 자세히 설명되어 있습니다

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

당신이 MariaDB 당신이 사용하지 않도록 설정하여이를 적용 할 수 있습니다 MySQL은 같은 계획을 사용하려면 테이블 제거 최적화 :

SET optimizer_switch='table_elimination=off';