mysql a 表 (100万记录)下面一个字段
`isH` char(1) NOT NULL,这个字段值仅仅有‘Y’ 'N" 2个值 。 sql 查询这个字段在where后面出现很多。是否有必要为这个字段建立索引??

如果isH有5个值是否有必要建立索引?此外
   外键字段 disId` int(11) 有2423423423 这么长  ,
  日期时间字段` (`startDate`) 如2010-1-1 12:23:21
这2个也需要建立索引sql 这个表a的很多
select   from  a where isH='Y';
select   from  a where startDate=?
select   from  a where disId=?

解决方案 »

  1.   

    这个字段值仅仅有‘Y’ 'N" 2个值 。  应该创建索引,如果 Y,N 的分布是平均的。 这样仅通过索引就可以减少一半的记录比较。
      

  2.   

    如何判读是否有必要创建索引
    1 唯一性太差的不适合单独建立索引
       如状态字段 类型字段总共也就几个或者几十个值重复使用。每个值都有上万的记录。
     如果一个sql返回数据超过全表的15%,就不因该用索引扫描来完成这个查询。
    2 更新非常频繁的不适合创建索引推理 `isH` char(1) NOT NULL,
    tpe 等全部去掉
      

  3.   

    如果是字符型  索引会把它转化为int类型0,1
    这样查询整型要快           这样看??/
      

  4.   

    这个表 是 innodb   数据有100多万“看索引聚集,一般这样的在myisam引擎下聚集很少。”“”  不清楚 啦。  这是在线表 现在没哟统一意见
    按照理论 是不应该建立的
    但是很多有经验的dba 认为还是应该建立 。  到底是建还是不建立??
      

  5.   

    mysql> show keys in a;
    +----------------------+------------+------------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+
    | Table                | Non_unique | Key_name                     | Seq_in_index | Column_name     | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
    +----------------------+------------+------------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+
    | a |          0 | PRIMARY                      |            1 | id              | A         |      435344 | NULL     | NULL   |      | BTREE      |         |
    | a |          0 | PRIMARY                      |            2 | messId       | A         |      435344 | NULL     | NULL   |      | BTREE      |         |
    | a |          1 | idx_BO_outhistory       |            1 | outcomeId       | A         |      435344 | NULL     | NULL   |      | BTREE      |         |
    | a |          1 | idx_BO_bhistory |            1 | bogIdentifier   | A         |      435344 | NULL     | NULL   |      | BTREE      |         |
    | a |          1 | idx_BisHiry            |            1 | isH       | A         |          18 | NULL     | NULL   |      | BTREE      |         |
    | a |          1 | idx_BedDate      |            1 | odgedDate | A         |      435344 | NULL     | NULL   |      | BTREE      |         |
    +----------------------+------------+------------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+
    6 rows in set
    这个是 所有的indes  详细 分析信息
    这个是字段isH` char(1) NOT NULL  的索引。   他的Cardinality =18.
    其他字段都是435344 的Cardinality 。这个表总记录数是435344。   他的值只有2个 'Y'  'N'
    | a |          1 | idx_BisHiry            |            1 | isH       | A         |          18 | NULL     |问是否哟必要建立这个索引???
      

  6.   

     explain  只能看到走索引 
    从前面的理论  唯一性太差的不适合单独建立索引。   这个列不适合建立su索引show keys in a; 这个字段Cardinality =18.   (该表总记录44万 只有值只有2个 'Y' 'N')
    这里想知道Cardinality =18.能证明什么??
      

  7.   

    按照道理应该去掉这些索引比方说有一个文章表,我们要实现某个类别下按时间倒序列表显示功能:SELECT * FROM articles WHERE category_id = ... ORDER BY created DESC LIMIT ...这样的查询很常见,基本上不管什么应用里都能找出一大把类似的SQL来,学院派的读者看到上面的SQL,可能会说SELECT *不好,应该仅仅查询需要的字段,那我们就索性彻底点,把SQL改成如下的形式:SELECT id FROM articles WHERE category_id = ... ORDER BY created DESC LIMIT ...我们假设这里的id是主键,至于文章的具体内容,可以都保存到memcached之类的键值类型的缓存里,如此一来,学院派的读者们应该挑不出什么毛病来了,下面我们就按这条SQL来考虑如何建立索引:不考虑数据分布之类的特殊情况,任何一个合格的WEB开发人员都知道类似这样的SQL,应该建立一个”category_id, created“复合索引,但这是最佳答案不?不见得,现在是回头看看标题的时候了:MySQL里建立索引应该考虑数据库引擎的类型!如果我们的数据库引擎是InnoDB,那么建立”category_id, created“复合索引是最佳答案。让我们看看InnoDB的索引结构,在InnoDB里,索引结构有一个特殊的地方:非主键索引在其BTree的叶节点上会额外保存对应主键的值,这样做一个最直接的好处就是Covering Index,不用再到数据文件里去取id的值,可以直接在索引里得到它。如果我们的数据库引擎是MyISAM,那么建立"category_id, created"复合索引就不是最佳答案。因为MyISAM的索引结构里,非主键索引并没有额外保存对应主键的值,此时如果想利用上Covering Index,应该建立"category_id, created, id"复合索引。唠完了,应该明白我的意思了吧。希望以后大家在考虑索引的时候能思考的更全面一点,实际应用中还有很多类似的问题,比如说多数人在建立索引的时候不从Cardinality(SHOW INDEX FROM ...能看到此参数)的角度看是否合适的问题,Cardinality表示唯一值的个数,一般来说,如果唯一值个数在总行数中所占比例小于20%的话,则可以认为Cardinality太小,此时索引除了拖慢insert/update/delete的速度之外,不会对select产生太大作用;还有一个细节是建立索引的时候未考虑字符集的影响,比如说username字段,如果仅仅允许英文,下划线之类的符号,那么就不要用gbk,utf-8之类的字符集,而应该使用latin1或者ascii这种简单的字符集,索引文件会小很多,速度自然就会快很多。这些细节问题需要读者自己多注意,我就不多说了。 原文地址 http://www.bsdlover.cn/html/51/n-2651.html 
    http://dev.firnow.com/course/7_databases/mysql/myshl/20100119/192665.html
      

  8.   

    Cardinality表示唯一值的个数 -----------这段话的英文不知道谁翻译的明显是有问题的 
    show keys in a; 这个字段Cardinality =18. (该表总记录44万 只有值只有2个 'Y' 'N')
    如果Cardinality表示唯一值的个数  那么这里他的值应该是2或者3 ('Y' 'N' NULL). 但是从mysql执行得到该Cardinality =18.有谁能解释吗 ???