几个重要的概念

  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后多了第二步,因此效率提高了很多。

表的结构

    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)组合就不行

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

  这个组合就用不到索引,因为不符合最左匹配原则。

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这个版本,大于是不参与索引匹配的因此这些sql都没参与索引匹配。

 

    select * from left_table where a=1 and id=2

  这里面id是聚簇索引列,而a是个二级索引列,那么这个是用聚集索引列,不用(a,b,c)这个索引,因为对于mysql 5.7 innodb 这个版本一条sql里面索引只能用一条。至于用那个,则是mysql自身的算法选择了。经过大量测试实验,规则如下,如果索引列数据数据一模一样,那么是谁先创建就选谁,如不一样,那么谁占用的列越多,或者列的数据越复杂则选它。

MySQL组合索引最左匹配原则的更多相关文章

  1. Mysql索引最左匹配原则

    先来看个例子: 1. 示例1:假设有如下的一张表: DROP TABLE IF EXISTS testTable; CREATE TABLE testTable ( ID BIGINT NOT NUL ...

  2. mysql组合索引之最左原则

    为什么在单列索引的基础上还需要组合索引? select product_id from orders where order_id in (123, 312, 223, 132, 224); 我们当然 ...

  3. 【转】MYSQL数据库四种索引类型的简单使用--MYSQL组合索引“最左前缀”原则

    MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引,这里对这些索引的做一些简单描述: (1)普通索引 这是最基本的MySQL数据库索引,它没有任何限制.它有以下几种创建方式: 创建索引 ...

  4. mysql 组合索引

    MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习. 为了形象地对比两者,再建一个表 ...

  5. MySQL联合索引最左匹配范例

    MySQL联合索引最左匹配范例 参考文章:http://blog.jobbole.com/24006/ 创建示例表. 示例表来自MySQL官方文档: https://dev.mysql.com/doc ...

  6. mysql组合索引与字段顺序

    很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引!一般来说,可能是某些字段没有创建索引,或者是组合索引中字段的顺序与查询语句中字段的顺序不符. 看下面的例子:假设有一 ...

  7. [转]mysql组合索引与字段顺序

    下列转自:http://www.tech-q.cn/archiver/tid-11673.html 很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引!一般来说,可能是 ...

  8. mysql组合索引的有序性<转>

    昨天同事关于军规里的一条mysql索引的问题咨询我,才发现自己也不太了解组合索引的规则.于是来记录一下: [推荐]如果有order by的场景,请注意利用索引的有序性.order by 最后的字段是组 ...

  9. mysql组合索引顺序参考

    问题背景 : 当我们需要创建一个组合索引, 索引的顺序对于效率影响很大, 怎么确定索引的顺序; 解决方法 : 我们应该依据字段的全局基数和选择性, 而不是字段的某个具体的值来确定; 表结构 :  dc ...

随机推荐

  1. 键盘高级操作技巧【TLCL】

    Ctrl-a     移动光标到行首. Ctrl-e     移动光标到行尾. Ctrl-f     光标前移一个字符:和右箭头作用一样. Ctrl-b     光标后移一个字符:和左箭头作用一样. ...

  2. Spark 属性配置

    1.Spark1.x 属性配置方式 Spark属性提供了大部分应用程序的控制项,并且可以单独为每个应用程序进行配置. 在Spark1.0.0提供了3种方式的属性配置: SparkConf方式 Spar ...

  3. nodejs 中module.exports 和 exports 区别详细介绍

    你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块接下来介绍创建过程,感兴趣的朋友可以参考下 你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块.例 ...

  4. ubuntu/centos printk 终端中不能打印信息及解决办法

    今天用ubuntu来调试信息,printk死活打印不出信息,即使把级别跳到<0>,即KERN_ALERT也不行,后再搜了好长时间网络, 这个地址:http://bbs.chinaunix. ...

  5. jsp:jstl标签之控制流程

    下面将要讲的用于流程控制的标签,其中包括:if.choose.when 与 otherwise 等.接下来对这些标签逐一讲解. 这个标签的作用和 Java 程序中的 if 语句作用相同,用于判断条件语 ...

  6. 五一清北学堂培训之Day 3之DP

    今天又是长者给我们讲小学题目的一天 长者的讲台上又是布满了冰红茶的一天 ---------------------------------------------------------------- ...

  7. SMOTE RF MLP demo use cross_val_score to find best argument 处理不平衡数据的demo代码 先做smote处理 再用交叉验证找到最好的模型参数 实践表明MLP更好

    # _*_coding:UTF-8_*_ from sklearn.externals.six import StringIO from sklearn import tree import pydo ...

  8. Github删除项目

    相关博客:GitLab删除项目操作 发现github的项目删除按钮挺难找的,记录一下. 1,先在github打开项目,进入项目 2,点击Settings,进去后往下拉就是删除按钮.

  9. LeetCode OJ:House Robber(住宅窃贼)

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  10. Linux-挂载命令

    1.查询与自动挂载 mount:查询系统中已挂载的设备 mount -a :依据配置文件.etc/fsatb的内容,自动挂载 2.挂在命令格式 mount [-t 文件系统] [-o 特殊选项] 设备 ...