MySQL索引列没有走索引?

问:为什么在重复性高的字段建索引提高的效率不高。可能反而会降低查找速度?

看如下例子:

表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; 如果此时去 走索引开销 同样 比不走索引要大。

猜你喜欢

转载自www.cnblogs.com/cyrbjh/p/12405280.html