今天遇到一个很奇怪的事情,同样两个差不多数据的表,都拥有一个记录时间的字段: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 索引了。
现在问题是,表的空间容量大小也会影响索引的执行??
1
DRcoding 2016-09-12 14:32:47 +08:00 1
表的空间空间大小会影响所有的表查询, A 表 700M ,还是 optimize table 下吧,至于何时使用索引何时不适用索引,主要是你的 between 语句范围的问题吧。
|
2
liprais 2016-09-12 14:34:11 +08:00 1
https://dev.mysql.com/doc/internals/en/optimizer-tracing.html
先 trace 一下看看到底发生了什么 |
3
akira 2016-09-12 14:34:49 +08:00 1
是的,数据库引擎会智能判断使用哪个索引或者是直接全表。类似你这个例子,使用索引并没有很好的过滤结果集,会认为不如直接全表扫描。
如果你觉得他判断有误,可以通过使用 use index 来强制 |
5
ten789 2016-09-12 17:01:07 +08:00
一共只有 30m 的表 难道要先用索引扫一遍然后再去表里抽数据么 直接把表装内存全表扫多好
|