3

出于某种原因,MySQL 5.6 会进行全表扫描,而 MySQL 5.1 则不会。为什么会这样?

编辑:两个表具有相同的确切索引

在 MySQL 5.1 上

    mysql> explain SELECT `kv`.`key`, `kv`.`value` FROM `kv` WHERE `kv`.`key` LIKE BINARY 'weit-149411-%';
+----+-------------+--------------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table        | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+--------------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | kv           | range | PRIMARY       | PRIMARY | 192     | NULL |  182 | Using where |
+----+-------------+--------------+-------+---------------+---------+---------+------+------+-------------+

在 MySQL 5.6 上

    mysql> explain SELECT `kv`.`key`, `kv`.`value` FROM `kv` WHERE `kv`.`key` LIKE BINARY 'weit-149411-%';
+----+-------------+--------------+-------+---------------+---------+---------+------+-------------+-------------+
| id | select_type | table        | type  | possible_keys | key     | key_len | ref  | rows        | Extra       |
+----+-------------+--------------+-------+---------------+---------+---------+------+-------------+-------------+
|  1 | SIMPLE      | kv           | ALL   | PRIMARY       | NULL    | NULL    | NULL |  108364642  | Using where |
+----+-------------+--------------+-------+---------------+---------+---------+------+-------------+-------------+
4

2 回答 2

0

您在 5.1 实例上拥有的统计信息可能是陈旧的,并且可能是在该表中的行数较少时收集的。

建议:在 5.6 上,设置全局 innodb_stats_persistent_sample_pages=300; 分析表;并检查查询执行。

于 2014-08-19T15:01:54.263 回答
0

原来这是预期的效果。从 MySQL 5.5 开始LIKE BINARY不再使用可用索引

我正在制作一个 Django 查询,该查询使用key__startswith 1进行查询,默认情况下执行 BINARY 查询。

我能够通过对键执行key__istartswith区分大小写的查询来解决此问题。这对我的用例来说很好,因为一切都是小写的。

于 2016-07-23T14:35:57.203 回答