• mysql索引及建立组合索引原则


    两个重要概念 

      1.对于mysql来说,一条sql中,一个表无论其蕴含的索引有多少,但是有且只用一条。
      2.对于多列索引来说(a,b,c)其相当于3个索引(a),(a,b),(a,b,c)3个索引,又由于mysql的索引优化器,其where条件后的语句是可以乱序的,比如(b,c,a)也是可以用到索引。如果条件中a,c出现的多,为了更好的利用索引故最好将其修改为(a.c,b)。

    ICP概念

      看了一篇大神的博客,上面说了通用索引匹配原则,这里也顺便说下。
      1.Index range 先确认索引的起止范围。
      2.Index Filter 索引过滤。
      3.Table Filter 表过滤。
      传说中mysql5.6后提出的icp就是多了第二步,以前Index filter是放在数据上操作的,现在5.6后多了第二步,因此效率提高了很多。

    原则:

    1、需要加索引的字段,要在where条件中
    2、数据量少的字段不需要加索引
    3、如果where条件中是OR关系,加索引不起作用
    4、符合最左原则
    举例:

    联合索引(a、b、c) 使用a或者a或者a、b或a、b、c这3种可以进行查找,不支持b、c进行查找

    什么时候创建组合索引?

    当我们的where查询存在多个条件查询的时候,我们需要对查询的列创建组合索引

    为什么不对没一列创建索引

    • 减少开销
    • 覆盖索引
    • 效率高

    减少开销:假如对col1、col2、col3创建组合索引,相当于创建了(col1)、(col1,col2)、(col1,col2,col3)3个索引
    覆盖索引:假如查询SELECT col1, col2, col3 FROM 表名,由于查询的字段存在索引页中,那么可以从索引中直接获取,而不需要回表查询

    效率高:对col1、col2、col3三列分别创建索引,MySQL只会选择辨识度高的一列作为索引。假设有100w的数据,一个索引筛选出10%的数据,那么可以筛选出10w的数据;对于组合索引而言,可以筛选出100w*10%*10%*10%=1000条数据。

    最左匹配原则

    假设我们创建(col1,col2,col3)这样的一个组合索引,那么相当于对col1列进行排序,也就是我们创建组合索引,以最左边的为准,只要查询条件中带有最左边的列,那么查询就会使用到索引。

    最频繁使用的列放在左边;查看列的选择性(即该列的索引值数量与记录数量的比值),比值越高,效果越好;

    表的结构

        CREATE TABLE `left_test` (
            `id` int(11) NOT NULL,
            `a` int(11) DEFAULT NULL,
            `b` int(11) DEFAULT NULL,
            `c` int(11) DEFAULT NULL,
            `d` int(11) DEFAULT NULL,
            `e` int(11) DEFAULT NULL,
             PRIMARY KEY (`id`),
             KEY `m_index` (`a`,`b`,`c`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    
    

      且插入了100万条数据。

    sql的分析

        select * from left_table where id=1。
        select * from left_table where id>1 and id<3
    

      使用了聚集索引,id为主键,那么这个表里面id则是聚集索引列,这条sql默认使用了聚集索引来搜索。

    select * from left_table where a=1
    select * from left_table where a=1 and b=1
    select * from left_table where a=1 and b=1 and c=1

      使用联合索引(a,b,c)。其中这些条件可以可以乱序,因为mysql的sql优化器会优化这些代码

        select * from left_table where a<1
        select * from left_table where a<1 and b<1
        select * from left_table where a<1 and b<1 and c<1
    

      对于现在mysql5.7中,只有小于等于和小于才会触发索引。而大于则是无法触发索引,且小于可以乱序(mysql优化器优化了),但是按照最左匹配原则。比如条件(b),(c),(b,c)组合就不行。

  • 相关阅读:
    Flutter-现有iOS工程引入Flutter
    EventBus 3.0使用详解
    一步一步教你实现iOS音频频谱动画(二)
    一步一步教你实现iOS音频频谱动画(一)
    iOS热更新实现方式
    github 远程仓库名或地址修改,本地如何同步
    Xmind ZEN破解版来袭:如何去除水印
    flutter packages get 慢 解决方案
    web计时机制——performance对象
    jQuery设计思想
  • 原文地址:https://www.cnblogs.com/gaojr/p/12524054.html
Copyright © 2020-2023  润新知