programing

MySQL과 MariaDB 쿼리 실행 계획의 차이점

newsource 2022. 9. 24. 12:39

MySQL과 MariaDB 쿼리 실행 계획의 차이점

MySQL과 MariaDB Query 실행계획의 차이가 있습니까?

만약 그렇다면 어떤 것이 더 좋습니까?

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

마리아 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 Plan에는 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';

언급URL : https://stackoverflow.com/questions/23243852/difference-between-mysql-and-mariadb-query-execution-plan