MYSQL 范围搜索时,表的空间容量大小会影响索引的执行?

2016-09-12 13:57:48 +08:00
 Felldeadbird

今天遇到一个很奇怪的事情,同样两个差不多数据的表,都拥有一个记录时间的字段:addtime int(10),并且也设定了为索引

A 表总数据量在 23W 条,表的总大小为: 700M ,其中索引大小 19M 。
B 表总数据量在 30W 条。表的总大小为: 30M ,其中索引大小为 11M 。
(两个表的时间内容差不多的。A表内容少于B表示因为 A表有时候会删除数据,导致不一致)。

我在两个表中分别运行下面的 SQL :
EXPLAIN SELECT * FROM A/B WHERE addtime BETWEEN 1451577600 AND 1473651217;

A 表,正常执行 addtime 索引。而且我搜索出来的范围达到 10W 条记录,依旧会走 addtime 索引。
B 表,不能正常执行 addtime 索引。除非查询结果只有到几万( 4W 以下)条时,才会走 addtime 索引。

为了验证是否和空间容量大小是否会影响索引的执行。我将 A 表大部分字段删掉了。大概占用空间低于 100M 时,上面的 SQL 就无法走 addtime 索引了。

现在问题是,表的空间容量大小也会影响索引的执行??

2508 次点击
所在节点    MySQL
5 条回复
DRcoding
2016-09-12 14:32:47 +08:00
表的空间空间大小会影响所有的表查询, A 表 700M ,还是 optimize table 下吧,至于何时使用索引何时不适用索引,主要是你的 between 语句范围的问题吧。
liprais
2016-09-12 14:34:11 +08:00
https://dev.mysql.com/doc/internals/en/optimizer-tracing.html
先 trace 一下看看到底发生了什么
akira
2016-09-12 14:34:49 +08:00
是的,数据库引擎会智能判断使用哪个索引或者是直接全表。类似你这个例子,使用索引并没有很好的过滤结果集,会认为不如直接全表扫描。

如果你觉得他判断有误,可以通过使用 use index 来强制
wupher
2016-09-12 16:16:38 +08:00
如 @akira 所言, MySQL 会决定要不要使用索引,所以会出现这种有索引但是仍然全表扫的情况。
ten789
2016-09-12 17:01:07 +08:00
一共只有 30m 的表 难道要先用索引扫一遍然后再去表里抽数据么 直接把表装内存全表扫多好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/305654

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX