首页 > 其他分享 >分别谈谈联合索引生效和失效的条件

分别谈谈联合索引生效和失效的条件

时间:2023-03-17 11:12:14浏览次数:59  
标签:myTest 用到 ---- 索引 谈谈 失效 where select

联合索引失效的条件

联合索引又叫复合索引。两个或更多个列上的索引被称作复合索引。

对于复合索引:Mysql从左到右使用索引中的字段,一个查询可以只使用索引中的一部分,但只能是最左侧部分。例如索引是key index (a,b,c)。可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 。当最左侧字段是常量引用时,索引就十分有效。

举例:建立 姓名(a)、年龄(b)、性别(c)的复合索引。

select * from myTest  where a=3 and b=5 and c=4; ----  abc顺序
select * from myTest  where  c=4 and b=6 and a=3; ---- where里面的条件顺序在查询之前会被mysql自动优化,效果跟上一句一样
select * from myTest  where a=3 and c=7; ---- a用到索引,b没有用,所以c是没有用到索引效果的
select * from myTest  where a=3 and b>7 and c=3; ---- a用到了,b也用到了,c没有用到,这个地方b是范围值,也算断点,只不过自身用到了索引
select * from myTest  where b=3 and c=4;   --- 因为a索引没有使用,所以这里 bc都没有用上索引效果
select * from myTest  where a>4 and b=7 and c=9; ---- a用到了 b没有使用,c没有使用
select * from myTest  where a=3 order by b; ---- a用到了索引,b在结果排序中也用到了索引的效果,a下面任意一段的b是排好序的
select * from myTest  where a=3 order by c; ---- a用到了索引,但是这个地方c没有发挥排序效果,因为中间断点了,使用 explain 可以看到 filesort
select * from mytable where b=3 order by a; ---- b没有用到索引,排序中a也没有发挥索引效果

最后说说索引失效的条件

  • 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
  • 存储引擎不能使用索引范围条件右边的列
  • 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *
  • mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描
  • is null,is not null也无法使用索引
  • like以通配符开头(’%abc…’)mysql索引失效会变成全表扫描的操作。

解决like‘%字符串%’时索引不被使用的方法?

字符串不加单引号索引失效

SELECT * from staffs where name='2000';  
-- 因为mysql会在底层对其进行隐式的类型转换
SELECT * from staffs where name=2000;  
--- 未使用索引

 

参考:

 

标签:myTest,用到,----,索引,谈谈,失效,where,select
From: https://www.cnblogs.com/xfeiyun/p/17225832.html

相关文章

  • WebApi 单文件发布Serilog 失效
    提问WebApi单文件发布Serilog失效怎么解决回答配置文件Appsetting.json增加Using块"Using":["Serilog.Sinks.Console","Serilog.Sinks.File"],示例{"Seril......
  • 技术分享 | 为什么 SELECT 查询选择全表扫描,而不走索引?
    也是很巧合,之前遇到过一次情况,一条SQL,根据时间范围查数据,但有时候速度很快,有时候速度就慢。第一反应是没有设置索引,但开发人员告诉我已经设置了二级索引,查询的速度依然有......
  • 请你谈谈关于IO同步、异步、阻塞、非阻塞的区别
    对于一个networkIO(这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process(orthread),另一个就是系统内核(kernel)。当一个read操作发生时,它会经历两个......
  • 请你谈谈单例模式的优缺点,注意事项,使用场景
    单例模式(Singleton),是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整......
  • 博客索引(暂未完成)
    会更新的,会的吧会的吧AtcoderdpICoins题解 LinkCF1779CLeastPrefixSum题解  LinkLoj507接竹竿题解Link......
  • 你能谈谈HashMap怎样解决hash冲突吗
    在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样。HashMap采用一种所谓的“Hash算法”来......
  • Mysql——索引失效
         ......
  • 谈谈 Redis 的过期策略
    在日常开发中,我们使用Redis存储key时通常会设置一个过期时间,但是Redis是怎么删除过期的key,而且Redis是单线程的,删除key会不会造成阻塞。要搞清楚这些,就要了解R......
  • 谈谈项目中单点登录的实现原理?
    单点登录在现在的系统架构中广泛存在,它将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用不同的单点登......
  • 15、INDEX索引(下)
    管理索引创建索引CREATE[UNIQUE|FULLTEXT|SPATIAL]INDEXindex_nameONtable_name(column1[ASC|DESC],column2[ASC|DESC],...);ALTERTABLEtable_nameADD[UNIQUE......