首页 文章

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

提问于
浏览
0

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

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

服务器2:mysql Ver 15.1使用readline 5.1分发10.0.12-MariaDB,用于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

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

相关问题