我们将一个完整的数据库从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相同的速度?可能有些查询也必须重写,但我认为配置似乎是必要的。
1条答案
按热度按时间vbopmzt11#
您可以使用更好的查询优化,使用内部连接
确保你的测试是在同样的条件下进行的。。相同的数据。。以及两个查询的第一个执行