zoukankan      html  css  js  c++  java
  • 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; 如果此时去 走索引开销 同样 比不走索引要大。

  • 相关阅读:
    Java序列化原理
    分库分表
    数据库索引
    监听TCP端口号:从简单Socket到NIO到Netty
    如何保证缓存与数据库的双写一致性
    代理模式:静态代理、JDK动态代理、Cglib动态代理
    Redis发布订阅(Pub-Sub)模式
    Redis分片机制(Sharding)
    Redis高可用性:主从、哨兵和集群
    Redis简介
  • 原文地址:https://www.cnblogs.com/cyrbjh/p/12405280.html
Copyright © 2011-2022 走看看