MySQL5.7中的查询速度比5.1慢2倍或更多

u2nhd7ah  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(293)

我们将一个完整的数据库从MySQL5.1.63迁移到了MySQL5.7.22中的一个不同的服务器上。现在大多数查询的速度平均慢了2倍。我们还没有对mysql 5.1做过太多优化。
以下是我们更改的配置:

table_open_cache            = 4096
tmp_table_size=256M
max_heap_table_size=256M
query_cache_limit       = 1000000
query_cache_size        = 32000000
innodb_buffer_pool_size = 3200M
innodb_log_buffer_size  = 1024M

下面是一个具体的例子:
我想让所有在课程中被评为教师的人:

SELECT id, TRIM(CONCAT_WS(" ", name, lastname)) AS name
FROM person
WHERE id IN (SELECT DISTINCT teacher_id FROM course)
ORDER BY name;

运行时间:
mysql 5.1:0.03s。后续查询:0.00s
MySQL5.7:1.27s。后续查询:0.80
相差40多倍。
在5.1中解释:

+----+--------------------+----------+----------------+--------------------+--------------------+---------+------+-------+-----------------------------+
| id | select_type        | table    | type           | possible_keys      | key                | key_len | ref  | rows  | Extra                       |
+----+--------------------+----------+----------------+--------------------+--------------------+---------+------+-------+-----------------------------+
|  1 | PRIMARY            | person   | ALL            | NULL               | NULL               | NULL    | NULL | 16293 | Using where; Using filesort |
|  2 | DEPENDENT SUBQUERY | course   | index_subquery | teacher_id         | teacher_id         | 5       | func |  2677 | Using index; Using where    |
+----+--------------------+----------+----------------+--------------------+--------------------+---------+------+-------+-----------------------------+

在5.7中解释:

+----+--------------+-------------+------------+--------+--------------------+--------------------+---------+----------------------+--------+----------+-------------+
| id | select_type  | table       | partitions | type   | possible_keys      | key                | key_len | ref                  | rows   | filtered | Extra       |
+----+--------------+-------------+------------+--------+--------------------+--------------------+---------+----------------------+--------+----------+-------------+
|  1 | SIMPLE       | person      | NULL       | ALL    | PRIMARY            | NULL               | NULL    | NULL                 |  16491 |   100.00 | Using where |
|  1 | SIMPLE       | <subquery2> | NULL       | eq_ref | <auto_key>         | <auto_key>         | 5       | db.person.id         |      1 |   100.00 | Using where |
|  2 | MATERIALIZED | course      | NULL       | index  | teacher_id         | teacher_id         | 5       | NULL                 | 109741 |   100.00 | Using index |
+----+--------------+-------------+------------+--------+--------------------+--------------------+---------+----------------------+--------+----------+-------------+

如果我这样写查询:

select distinct person.id, trim(concat_ws(" ", name, lastname)) as name 
from person, course
where person.id = course.teacher_id
order by name;

时代将变成:
mysql 5.1:0.01s
MySQL5.7:0.03s版本
所以,它好一点,但还是慢一点。 course.teacher_id 有索引。
安装之间的区别之一是,在5.7服务器中,数据文件夹位于另一个驱动器上(ssd,性能比5.1服务器中的驱动器好一点)。
有什么建议我应该配置什么使5.7达到与5.1相同的速度?可能有些查询也必须重写,但我认为配置似乎是必要的。

vbopmzt1

vbopmzt11#

您可以使用更好的查询优化,使用内部连接

SELECT id, TRIM(CONCAT_WS(" ", name, lastname)) AS name
  FROM person
  INNER JOIN (
    SELECT DISTINCT teacher_id FROM course
  ) t on  t.teacher_id = person.id 

  ORDER BY name;

确保你的测试是在同样的条件下进行的。。相同的数据。。以及两个查询的第一个执行

相关问题