mysql从5.5升级到5.6后查询速度变慢

mysql从5.5升级到5.6后查询速度变慢,mysql,indexing,mysql-5.5,mysql-5.6,Mysql,Indexing,Mysql 5.5,Mysql 5.6,我们正在将mysql从5.5升级到5.6,现在有些查询速度非常慢 以前需要0.005秒的查询现在需要49秒 5.6上的查询正在跳过索引,似乎: +----+-------------+-------+-------+----------------------------------------------------+---------+---------+------+--------+-------------+ | id | select_type | table | type | p

我们正在将mysql从5.5升级到5.6,现在有些查询速度非常慢

以前需要0.005秒的查询现在需要49秒

5.6上的查询正在跳过索引,似乎:

+----+-------------+-------+-------+----------------------------------------------------+---------+---------+------+--------+-------------+
| id | select_type | table | type  | possible_keys                                      | key     | key_len | ref  | rows   | Extra       |
+----+-------------+-------+-------+----------------------------------------------------+---------+---------+------+--------+-------------+
|  1 | SIMPLE      | pens  | index | index_contents_on_slug,index_contents_on_slug_hash | PRIMARY | 4       | NULL | 471440 | Using where |
+----+-------------+-------+-------+----------------------------------------------------+---------+---------+------+--------+-------------+
1 row in set (0.00 sec)
但在5.5中没有被跳过:

+----+-------------+-------+-------------+----------------------------------------------------+----------------------------------------------------+---------+------+------+----------------------------------------------------------------------------------------------+
| id | select_type | table | type        | possible_keys                                      | key                                                | key_len | ref  | rows | Extra                                                                                        |
+----+-------------+-------+-------------+----------------------------------------------------+----------------------------------------------------+---------+------+------+----------------------------------------------------------------------------------------------+
|  1 | SIMPLE      | pens  | index_merge | index_contents_on_slug,index_contents_on_slug_hash | index_contents_on_slug_hash,index_contents_on_slug | 768,768 | NULL |    2 | Using union(index_contents_on_slug_hash,index_contents_on_slug); Using where; Using filesort |
+----+-------------+-------+-------------+----------------------------------------------------+----------------------------------------------------+---------+------+------+----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
两个数据库都是从同一个mysql转储创建的

当我在5.6上进行导入时,是否没有构造这些索引?如何强制创建索引

查询:

SELECT  `pens`.* FROM `pens`  WHERE (slug_hash = 'style' OR slug = 'style') ORDER BY `pens`.`id` DESC LIMIT 1

编辑:删除了模式

v5.6中的慢速查询是由于引擎无法或决定不合并两个相关索引索引索引内容(位于\u slug\u散列上)和索引内容(位于\u slug上)以处理您的查询。请记住,查询每个表只能使用一个索引。为了能够利用同一个表上的多个索引,它需要动态地将这些索引预合并到内存中的一个索引中。这就是执行计划中索引合并和通知的含义。显然,这会消耗时间和内存

快速修复和可能首选的解决方案:在slug和slug_散列上添加两列索引


现在,您的新服务器可能无法合并这些索引,因为这会导致索引太大,无法放入缓冲区。与旧安装相比,新服务器的表是MyISAM还是InnoDB的值可能要小得多。

v5.6中的查询速度慢是因为引擎无法或决定不合并slug\u散列上的两个相关索引index\u contents\u,索引\u slug上的\u内容以处理查询。请记住,查询每个表只能使用一个索引。为了能够利用同一个表上的多个索引,它需要动态地将这些索引预合并到内存中的一个索引中。这就是执行计划中索引合并和通知的含义。显然,这会消耗时间和内存

快速修复和可能首选的解决方案:在slug和slug_散列上添加两列索引


现在,您的新服务器可能无法合并这些索引,因为这会导致索引太大,无法放入缓冲区。如果表是MyISAM或InnoDB,则新服务器的值可能比旧安装中的值小得多。

最终,上面接受的答案是正确的

来自@RandomSeed的帮助让我朝着正确的方向思考。基本上,在5.6中创建的优化计划与在5.5中创建的优化计划有很大的不同,因此您可能需要像我一样重新编写查询


我最终没有使用FORCE索引,而是删除了部分查询,直到我确定是什么导致5.6错过了索引。然后我修改了应用程序逻辑来处理这个问题。

最终,上面接受的答案是正确的

来自@RandomSeed的帮助让我朝着正确的方向思考。基本上,在5.6中创建的优化计划与在5.5中创建的优化计划有很大的不同,因此您可能需要像我一样重新编写查询


我最终没有使用FORCE索引,而是删除了部分查询,直到我确定是什么导致5.6错过了索引。然后,我重新编写了应用程序逻辑来处理这个问题。

能否显示表架构和查询?您可以将查询重写为一个联合,或者尝试忽略索引主索引。我不确定ignore在这种情况下是否有效,但值得一试。添加了更多架构信息。正如您所看到的,这是一个单独的表,而不是一个并集。查询似乎缺少slug和slug_哈希表上的索引。请显示表架构和查询。您可以将查询重写为联合,或者尝试忽略索引主索引。我不确定ignore在这种情况下是否有效,但值得一试。添加了更多架构信息。正如您所看到的,这是一个单独的表,而不是一个并集。查询似乎缺少slug上的索引,slug_hashI仍然不足。我增加了innodb_buffer_pool_大小,如下所示:| innodb_buffer_pool_size | 1572864000 |并重新启动。我还添加了您在上面提出的索引,但仍然得到一个45秒的查询,没有使用这些索引。还有其他建议吗?尝试在WHERE子句之前添加一个强制索引INDEX\U contents\U on\U slug\U hash、INDEX\U contents\U on\U slug子句。还可以尝试删除ORDERBY子句。执行计划有什么不同吗?嗯,部队指数有帮助,但没有把我们带到一个可以接受的地方。第一次查询为10秒,后续每次查询为9秒。我从MacOSX和5.5(由自制软件安装)以及5.6(由mysql提供的ubuntu.deb安装)转换过来,这有关系吗?此外,5.6安装程序在一个流浪的虚拟机上运行。我想我会看到一个小的性能打击,但没有像我在这里得到的数量级。我不能肯定地回答,但它不应该。然而,在VM中运行MySQL时,我总是很谨慎。但是,请让我们比较一下什么是可比的。这是什么意思
新的执行计划看起来是什么样的?总的来说,让我们把虚拟机排除在外,特别是因为我们仍然没有达到指标:我仍然不够。我增加了innodb_buffer_pool_大小,如下所示:| innodb_buffer_pool_size | 1572864000 |并重新启动。我还添加了您在上面提出的索引,但仍然得到一个45秒的查询,没有使用这些索引。还有其他建议吗?尝试在WHERE子句之前添加一个强制索引INDEX\U contents\U on\U slug\U hash、INDEX\U contents\U on\U slug子句。还可以尝试删除ORDERBY子句。执行计划有什么不同吗?嗯,部队指数有帮助,但没有把我们带到一个可以接受的地方。第一次查询为10秒,后续每次查询为9秒。我从MacOSX和5.5(由自制软件安装)以及5.6(由mysql提供的ubuntu.deb安装)转换过来,这有关系吗?此外,5.6安装程序在一个流浪的虚拟机上运行。我想我会看到一个小的性能打击,但没有像我在这里得到的数量级。我不能肯定地回答,但它不应该。然而,在VM中运行MySQL时,我总是很谨慎。但是,请让我们比较一下什么是可比的。新的执行计划是什么样子的?总之,让我们把虚拟机排除在外,特别是因为我们仍然没有达到索引:
ALTER TABLE pens ADD INDEX index_contents_on_slug_and_slug_hash (
    slug, slug_hash
);