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

  • 相关阅读:
    scp 指定端口(转)
    openshift 入门 部署 openshift-origin-server-v3.7.0
    kubernetes 网络模型
    故障排除--kubernetes 运维操作步骤 -- kubedns -- busybox -- nslookup 问题
    Service 服务发现的两种方式-通过案例来理解+服务外部访问类型+selector-label
    nmap 扫描端口 + iftop 实时监控流量
    Intellij IDEA 2016.3.4 注册激活--转
    laravel服务提供者类说明
    使用PHP实现命令模式(转)
    异步回收fork出的子进程(僵尸进程)
  • 原文地址:https://www.cnblogs.com/cyrbjh/p/12405280.html
Copyright © 2020-2023  润新知