[英]Difference between MySQL and MariaDB Query execution plan
MySQL和MariaDB查詢執行計划之間有區別嗎?
如果是,哪個更好?
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`)
);
在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)
在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)
您會看到“表消除”優化的效果(MySQL計划有4行,而MariaDB僅有3行)。 MariaDB計划應該是更好的計划,因為“要做的工作更少”。 兩者都應返回相同的結果。
該功能在此處詳細說明:
http://s.petrunia.net/blog/?p=58
和這里:
如果您希望MariaDB使用與MySQL相同的計划,則可以通過以下方式禁用表消除優化來實施此計划:
SET optimizer_switch='table_elimination=off';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.