关于 在数据库中 0和1 到底需不需要建立索引?
在以前的面试中,遇到过关于数据库中某一列 只有 0和1 需不需要建立索引? 记得当时的回答是不需要,但是却不知道原因。今天就来看看 为什么数据库只有0和1 这个简单数据不需要建立索引;
废话不多说,实践出真理。
1:首先现在数据库中插入status=0 和 status=1 各自一万条数据。完成后来查询看看
第一次:
第二次:
第三次:
现在添加索引再试试:
第一次:
第二次:
第三次:
可以看到 在数据量只有两万条的情况下,有没有索引影响不大 ,下面把 status=0 和status=1 各自增加到 5万条在进行查询。
第一次:
第二次:
第三次:
加上索引
第一次:
第二次:
第三次:
可以看到,添加了索引速度反而还慢了一点,不对,这一定是数据量不够,所以索引效果不好,现在,把 status=0 和status=1 各自增加到50万条试试。
第一次:
第二次:
第三次:
加上索引:
第一次:
第二次:
第三次:
经过上面三次实验发现,对于这种简单数据的列,创建索引反而比没有创建索引时查询还要慢。这不符合我的想象啊。后来看到一篇帖子上面有这么一段话。个人认为应该是这么回事。
因为通过索引读取数据行是随机磁盘读取,相对于不使用全表扫描的连续磁盘读取,要慢很多。虽说加了索引之后读取的数据块少了,但是对于只有0和1这样区分度极差的索引,花费在随机磁盘读取上的大量开销会抵消这部分好处,何况索引会对增删改的性能造成影响,因此,不建议为该列单独添加索引。
《高性能MySQL》中提到过类似的情况,假设常用的查询是这样的:
select * from table where flag=1 and 类别 = 'abc';
select * from table where 类别 = 'abc';
select * from table where flag=1;
可以为table添加索引(flag,类别),很明显,第一个和第三个查询可以使用该索引,其实第二个查询也可以用到该索引,所要做的工作是改变第二条语句的形式:
select * from table where flag in (0,1) and 类别 = 'abc';
flag in (0,1)会让MySQL把flag看做“=”,因此就可以使用索引继续对类别字段进行查找了,而不需要单独创建并维护flag列上的索引~
大家有不同看法可以指教,相互学习哈!