Percona的5.6 InnoDB的问题,不使用索引正确(Percona 5.6 InnoDB i

2019-10-19 00:08发布

我刚安装了Percona的5.6我的新的CentOS 6.4的服务器上。 这是一个快速的机器32核心氙,72GB RAM,8X SAS RAID 10设置。 到现在为止还挺好

我的旧服务器是有点不那么强大,并运行MySQL 5.1依旧。 因此,这是相当的升级。 但我在使用InnoDB的一些问题,没有正确使用的一些表似乎索引。 当我的旧机器上的相同的查询都运行良好。

两个服务器具有相同的数据库。 我做的旧机器上的一个mysqldump和其导入到新的Percona 5.6服务器。 指数保持不变。 这两个服务器都使用相同的my.cnf配置设置。

表中的项目有指标: item_id, item_format, item_private ,包含约40万行。 表格式对指数: 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

查询与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 |             |
+----+-------------+-------+--------+---------------+---------+---------+----------------------+------+-------------+

查询与EXPLAIN NEW [问题]服务器上。

+----+-------------+-------+------+---------------+-------------+---------+--------------------+------+---------------------------------+
| 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                     |
+----+-------------+-------+------+---------------+-------------+---------+--------------------+------+---------------------------------+

你可以看到它使用临时和文件排序。 这似乎是缓慢的原因。

任何想法,我怎么能解决这个问题呢?

Answer 1:

这听起来像: 错误#70617默认持久统计可能会导致意外长的查询时间

对于它的价值,这是不是一个错误的Percona,这也是目前在MySQL 5.6的社区版。

有三种可能的解决方法:

  1. 使用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 

    我已经重写你的加入以使用SQL-92语法,我建议。

  2. 停用新的InnoDB持续统计功能,恢复到预5.6行为。

    在您的my.cnf文件:

     innodb_stats_persistent=0 
  3. 手动刷新InnoDB的优化统计你的数据的显著变化(例如,后加载的mysqldump)后:

     ANALYZE TABLE items; ANALYZE TABLE formats; 

PS:我在Percona的工作,而这个错误是由我的同事发现贾斯汀Swanhart 。



文章来源: Percona 5.6 InnoDB issue not using indexes correctly