簡體   English   中英

MySQL和MariaDB查詢執行計划之間的區別

[英]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

和這里:

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

如果您希望MariaDB使用與MySQL相同的計划,則可以通過以下方式禁用表消除優化來實施此計划:

SET optimizer_switch='table_elimination=off';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM