关于 在数据库中 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列上的索引~

大家有不同看法可以指教,相互学习哈!

 

posted @ 2018-07-03 16:34  Jvpchao  阅读(843)  评论(0编辑  收藏  举报