zoukankan      html  css  js  c++  java
  • 关于 在数据库中 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列上的索引~

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

  • 相关阅读:
    HDU4652 Dice
    CF113D Museum / BZOJ3270 博物馆
    SHOI2013 超级跳马
    最基本的卷积与反演
    NOI2014 动物园题解
    SP11414 COT3
    new to do
    linux C++中宏定义的问题:error: unable to find string literal operator ‘operator""fmt’ with ‘const char [4]’, ‘long unsigned int’ arguments
    新装vs2010的问题:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    windows下删除虚拟串口的方法,以及解决串口使用中,无法变更设备串口号的问题
  • 原文地址:https://www.cnblogs.com/jvpBlog/p/9259313.html
Copyright © 2011-2022 走看看