问:为什么在重复性高的字段建索引提高的效率不高。可能反而会降低查找速度?
看如下例子:
表A (ID,col1,col2,col3,col4,..col100) 100个字段,现在COL4上创建索引,而COL4中所有的值都为1;
update a set col4=1 ,10000条记录,COL4都是1。
如果你查询 select * from A where col4=1; MYSQL就不会再去走索引。
因为如果走索引反而速度慢。 MYSQL会自行判断是否需要使用索引。这也是为什么经常会看到EXPLAIN中明明有索引,但并未被使用。
为什么走索引反而更慢?
先理解普通索引,主键索引,回表
普通索引:创建索引后数据库会创建一个普通索引树,普通索引树存的是索引列的值和主键ID的值。
主键索引:创建表时,不管有没有指定主键,mysql innodb会默认创建一个主键索引和主键索引树。
主键索引树存的是主键列的值和整行的数据值。这里主键默认为ID
理解回表:where name = "zhangs" ;主键ID,普通索引列name;
这条sql执行时,数据库引擎会在普通索引列上找到name=zhangs的那个节点数据中id的值为多少,如id=30
再根据ID的值,去主键索引树上查找到id=30的那一列,这个过程叫回表。
查询到结果后返回。
为什么会慢的原因:
(正常情况下查询时,数据库存储引擎会根据普通索引查找到数据(这个数据数据是主键id的值),
根据查到的数据去主键索引树上进行查找到相应的行(过程叫回表),每行中有所有列的数据,
当COL4所有值都是1时,是把所有列的数据都进行了一次回表,比全表扫描多一次回表(如10000条数据,就多回表了10000次))
同样。即使 update a set col4=0 where id=10, 这样, 仅ID=10的记录COL4=0,而其余9999条记录仍是COL4=1。
同样select * from A where col4=1; 如果此时去 走索引开销 同样 比不走索引要大。