相同的查询具有相同的数据,性能不同

时间:2015-04-02 01:20:59

标签: mysql

我在两个不同的服务器上运行带有相同数据集的SQL查询。

服务器1:mysql Ver 14.14使用readline 5.1分发5.1.73,用于unknown-linux-gnu(x86_64)

Server 2:mysql Ver 15.1 Distrib 10.0.12-MariaDB,for readx 5.1 for osx10.10(x86_64)

查询是:

SELECT
 *
FROM
 `user`
WHERE
 user_id IN (SELECT user_id FROM reader_detail)
AND `user`.type <> 4
AND `user`.type <> 11
AND user_id NOT IN (
 SELECT
  `user_id`
 FROM
  reader_log
 WHERE
  reader_log.`date` > DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
 GROUP BY
  user_id
 ORDER BY
  user_id ASC
)
AND username IS NOT NULL;

服务器1上的EXPLAIN SELECT:

+----+--------------------+---------------+-----------------+---------------+---------+---------+------+-------+--------------------------+
| id | select_type        | table         | type            | possible_keys | key     | key_len | ref  | rows  | Extra                    |
+----+--------------------+---------------+-----------------+---------------+---------+---------+------+-------+--------------------------+
|  1 | PRIMARY            | user          | ALL             | NULL          | NULL    | NULL    | NULL | 29865 | Using where              |
|  3 | DEPENDENT SUBQUERY | reader_log    | index           | NULL          | PRIMARY | 7       | NULL |    17 | Using where; Using index |
|  2 | DEPENDENT SUBQUERY | reader_detail | unique_subquery | PRIMARY       | PRIMARY | 4       | func |     1 | Using index              |
+----+--------------------+---------------+-----------------+---------------+---------+---------+------+-------+--------------------------+

服务器2上的EXPLAIN SELECT:

+------+--------------------+---------------+----------------+----------------------+---------+---------+----------------------------------------+-------+--------------------------+
| id   | select_type        | table         | type           | possible_keys        | key     | key_len | ref                                    | rows  | Extra                    |
+------+--------------------+---------------+----------------+----------------------+---------+---------+----------------------------------------+-------+--------------------------+
|    1 | PRIMARY            | reader_detail | index          | PRIMARY              | PRIMARY | 4       | NULL                                   | 17682 | Using where; Using index |
|    1 | PRIMARY            | user          | eq_ref         | PRIMARY              | PRIMARY | 4       | rklocaldbmigrate.reader_detail.user_id |     1 | Using where              |
|    3 | DEPENDENT SUBQUERY | reader_log    | index_subquery | PRIMARY,user_id_date | PRIMARY | 4       | func                                   |    16 | Using index; Using where |
+------+--------------------+---------------+----------------+----------------------+---------+---------+----------------------------------------+-------+--------------------------+

在服务器2上运行的查询时间不到1秒:集合中的5894行(0.09秒)但是,在查询运行超过1分钟后,我不得不在服务器1上中止。

这里发生了什么?是因为服务器2使用的是MariaDB,而它是服务器1上的MySQL?我在这里很无能为力。同样,它是相同的数据集(我从服务器1运行mysqldump到服务器2)。

1 个答案:

答案 0 :(得分:0)

解决方案是在服务器1上用MariaDB替换MySQL。