2014-04-23 19 views
6

Có sự khác biệt nào giữa kế hoạch thực hiện truy vấn MySQL và MariaDB không?Sự khác biệt giữa kế hoạch thực hiện truy vấn MySQL và MariaDB

Nếu có, cái nào tốt hơn?

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

Trong 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) 

Trong 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

Kết quả mang lại kết quả chính xác sẽ tốt hơn. Nếu không, bằng cách sử dụng các bảng đơn giản ngớ ngẩn này với hầu như không có dữ liệu chỉ đơn giản là vô dụng như phương pháp thử nghiệm. –

Trả lời

2

Bạn đang nhìn thấy tác dụng của "loại bỏ Bảng" tối ưu hóa (kế hoạch MySQL có 4 hàng khi MariaDB người ta chỉ 3). Kế hoạch MariaDB nên là tốt hơn vì có "ít việc phải làm" hơn. Cả hai nên trả lại kết quả tương tự mặc dù.

Tính năng này được giải thích chi tiết ở đây:

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

và ở đây:

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

Nếu bạn muốn MariaDB sử dụng kế hoạch tương tự như MySQL bạn có thể thực hiện điều này bằng cách tắt tối ưu hóa loại bỏ bảng với:

SET optimizer_switch='table_elimination=off'; 
Các vấn đề liên quan