我刚在新的CentOS 6.4服务器上安装了Percona 5.6。它是一台快速机器32核氙,72GB内存,8x SAS RAID 10设置。到目前为止一切顺利
我的旧服务器功能稍弱,而且还在运行MySQL 5.1。所以这是一次升级。但我遇到InnoDB的一些问题,它似乎没有在某些表上正确使用索引。在我的旧机器上,相同的查询运行良好。
两台服务器都有相同的数据库。我在旧机器上做了一个mysqldump并将其导入到新的Percona 5.6服务器上。指数保持不变。两台服务器都使用相同的my.cnf配置设置。
表项目的索引为:item_id, item_format, item_private
,包含大约4000万行。表格格式的索引位于:format_id
,包含大约250行。
SELECT
i.item_name, i.item_key, i.item_date, f.format_long
FROM
items i, formats f
WHERE
i.item_format = f.format_id
AND
i.item_private = 0
ORDER BY
i.item_id DESC LIMIT 8
在我的旧服务器上,此查询大约需要0.0003 seconds
。在新服务器上,它接管100 seconds
。
在OLD服务器上使用EXPLAIN进行查询。
+----+-------------+-------+--------+---------------+---------+---------+----------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+----------------------+------+-------------+
| 1 | SIMPLE | i | index | item_format | PRIMARY | 4 | NULL | 8 | Using where |
| 1 | SIMPLE | f | eq_ref | PRIMARY | PRIMARY | 4 | dbname.i.item_format | 1 | |
+----+-------------+-------+--------+---------------+---------+---------+----------------------+------+-------------+
在NEW [问题]服务器上使用EXPLAIN查询。
+----+-------------+-------+------+---------------+-------------+---------+--------------------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+-------------+---------+--------------------+------+---------------------------------+
| 1 | SIMPLE | f | ALL | PRIMARY | NULL | NULL | NULL | 219 | Using temporary; Using filesort |
| 1 | SIMPLE | i | ref | item_format | item_format | 4 | dbname.f.format_id | 3026 | Using where |
+----+-------------+-------+------+---------------+-------------+---------+--------------------+------+---------------------------------+
你可以看到它正在使用临时文件和文件。这似乎是缓慢的原因。
知道如何解决这个问题吗?
答案 0 :(得分:2)
这听起来像是:Bug #70617 Default persistent stats can cause unexpected long query times
对于它的价值,这不是Percona错误,它也出现在MySQL 5.6社区版中。
有三种可能的解决方法:
使用STRAIGHT_JOIN向优化器提示不重新排序表引用。
SELECT STRAIGHT_JOIN
i.item_name, i.item_key, i.item_date, f.format_long
FROM items i
INNER JOIN formats f
ON i.item_format = f.format_id
WHERE i.item_private = 0
ORDER BY i.item_id DESC LIMIT 8
我已经重写了你的JOIN以使用我推荐的SQL-92语法。
停用新的InnoDB persistent stats功能,恢复到5.6之前的行为。
在my.cnf文件中:
innodb_stats_persistent=0
在对数据进行重大更改后手动刷新InnoDB优化程序统计信息(例如,在加载mysqldump之后):
ANALYZE TABLE items;
ANALYZE TABLE formats;
PS:我在Percona工作,我的同事Justin Swanhart发现了这个错误。