这是我的table:
在我的table上 Clustering_key
(主键和自动增量) ID
(索引列) Data
(文本数据类型列) Position
(索引列)保持 Data
我的table上有90000行 ID
等于5。我想和你一起去前三排 ID
等于5,我的查询如下
Select * from mytable where ID=5 Limit 3;
``` `ID` 列是索引列,所以我认为mysql只扫描前3行,但mysql扫描大约42000行。
这里解释查询:
![](https://i.stack.imgur.com/61x5L.png)
避免所有行扫描的任何可能性。
请给我一些解决办法
提前谢谢
3条答案
按热度按时间gdx19jrr1#
你可以看到
Innodb_rows_read
只需增加1的限制1。如果您做一个完整的表扫描查询,您可以看到值会随着表的计数而增加。两方面都证实了这一点
explain
因为limit似乎提供了有关所检查行的误导性信息。nsc4cvqm2#
我模拟了这个场景。
使用创建表
插入的数据
解释
是的,那个
explain
显示检查的行是5,但不是3。但这似乎只是一个误导性的信息。可以通过以下步骤为所有查询启用慢速日志(将long\u query\u time设置为0)来验证所检查的运行时行的确切数目。注意:只能在自己的测试数据库中设置long\u query\u time=0。测试后,必须将参数重置回先前的值。
通过检查
slow_query_log_file
上面打印/usr/local/mysql/data/slow.log
你可以找到以下信息。运行时
Rows_exmained
值等于limit
参数。测试是在mysql 5.7.18上完成的。mpbci0fu3#
----另一种验证方法