mysql 联合索引匹配原则

本文深入探讨MySQL索引的工作原理,包括单列索引、多列索引的应用及优化技巧,介绍了索引优化器如何提升查询效率,并通过具体示例说明了不同查询条件下索引的使用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读mysql文档有感

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

表的结构

    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自身的算法选择了。经过大量测试实验,规则如下,如果索引列数据数据一模一样,那么是谁先创建就选谁,如不一样,那么谁占用的列越多,或者列的数据越复杂则选它。

转载于:https://www.cnblogs.com/donghang/p/9233793.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值