复合(组合)索引失效的几种情况总结(代码片段)

i永无止境 i永无止境     2023-02-03     229

关键词:

创建一张测试表:EMP 表

CREATE TABLE emp (
  id INT (11) NOT NULL AUTO_INCREMENT,
  empno INT NOT NULL,
  NAME VARCHAR (30) DEFAULT NULL,
  age INT (13) DEFAULT NULL,
  deptId INT (11) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8 ;

向该表中插入500000条数据

1.复合索引绑定的第一个列,没有出现在查询条件中;(全部失效,第2-7项的情况是部分失效)

举例说明:为emp表插入索引idx_age_deptid_name(age,deptid,name),但是在查询条件中未使用age,导致复合索引全部失效。

注:key_len的说明:

①所选键的字节长度,值越大越好

②int类型占4个字节,1个汉字(UTF-8)占3个字节(GBK占2个字节),非空占1个字节。

2.复合索引绑定的多个列是有顺序的,某一个列没有出现在查询条件中,存储引擎不能使用索引中该列及其后的所有列。

举例:为emp表插入索引idx_age_deptid_name(age,deptid,name),查询时查询条件里没有deptid列,会导致复合索引中的deptid及其后的索引失效。

key_len是5,只用到了复合索引的age。

3.查询条件中出现某个列是范围查询的,存储引擎不能使用复合索引中该列其后的所有列。

举例:为emp表插入索引idx_age_deptid_name(age,deptid,name),查询时查询条件里deptid列使用到了范围查询,会导致复合索引中的deptid其后的索引失效。

key_len是10,只用到了复合索引的age和deptid。

4.查询条件中某列使用否定条件的(!= <> IS NOT NULL),存储引擎不能使用索引中该列其后的所有列。

举例:为emp表插入索引idx_age_deptid_name(age,deptid,name),查询时查询条件里deptid列使用到了否定条件,会导致复合索引中的deptid其后的索引失效。

key_len是10,只用到了复合索引的age和deptid。

5.查询条件中某列使用LIKE条件后的字段是以%开头的(如:’%ABC’),存储引擎不能使用索引中该列及其后的所有列。

举例:为emp表插入索引idx_age_deptid_name(age,deptid,name),查询时查询条件里name列使用到了like ‘%a’,会导致复合索引中的name及其后的索引失效。

key_len是10,只用到了复合索引的age和deptid,并没有用到name列的索引。

6.查询条件中某列使用函数的,存储引擎不能使用索引中该列及其后的所有列。

举例:为emp表插入索引idx_age_deptid_name(age,deptid,name),查询时查询条件里name列使用到了like ‘%a’,会导致复合索引中的name及其后的索引失效。

key_len是10,只用到了复合索引的age和deptid,并没有用到name列的索引。

7.查询条件中某列使用类型转换的(包括显示的和隐示的),存储引擎不能使用索引中该列及其后的所有列。如:字符串类型的列NAME=3,就是隐示的类型转换,将INT型转换为字符串类型。如果写为NAME=’3’,就不是类型转换。

举例:为emp表插入索引idx_age_deptid_name(age,deptid,name),查询时查询条件name=3,会导致复合索引中的name及其后的索引失效。条件写成name=‘3’,索引就不会失效。

 

总结:

  1. 在实际开发中,对sql语句进行调优,就要尽量避免出现以上索引失效的情况。

  2. 对于单键索引,尽量选择针对当前查询过滤性更好的索引,能选择复合索引的尽量选择复合索引。

  3. 在选择复合索引的时候,当前查询中过滤性最好的字段在索引字段顺序中,位置越靠前越好。

  4. 在选择复合索引的时候,尽量选择可以能够包含当前query中的where字句中更多字段的索引。

  5. 在选择复合索引的时候,如果某个字段可能出现范围查询时,尽量把这个字段放在索引次序的最后面。

sql优化/索引失效的几种情况/fic/onlineddl(代码片段)

文章目录SQL优化索引失效的几种情况FIC(FastIndexCreation)原理OnlineDDLSQL优化针对SQL进行调整,在写SQL的时候遵循最左前缀原则,向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,范围列... 查看详情

c++迭代器失效的几种情况总结(代码片段)

...式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式,还好erase方法可以返回下一个有效... 查看详情

mysql高级--优化——创建索引原则使用场景和索引失效的情况(代码片段)

...是索引,isnull,使用索引3、索引失效的情况3.1、复合(组合)索引,不满足最左原则3.2、复合(组合)索引时,范围条件(>、>=、<、<=、betweenand、in等)右边的列索引失效3.3、like查询... 查看详情

迭代器失效的几种情况(代码片段)

引言:最近自己写代码用到了删除链表中某个节点操作,因为迭代器使用不规范,造成了程序崩溃。例如,对某个迭代器解引用所获得的值并不是执行erase()前这个迭代器指向的值,还有可能对未指向任何元素的迭... 查看详情

mysql哪些情况下索引会失效(代码片段)

众所周知,MySQL索引是以B+树存储的,而且是否使用索引是由引擎决定的,当MySQL觉得走索引花费开销大时,反而会放弃走索引。总结一下,哪些情况下会使索引失效:对where条件中的字段进行了函数操作,比如month(t_modified)=7;隐... 查看详情

oracle查询不走索引的一些情况(索引失效)(代码片段)

...,则查询条件中必须包含索引中的引导列。比如一个复合索引包含A,B,C,D四列,则A为引导列(排在第一位置的列)。如果WHERE子句中所包含的列是BCD或者BD等情况,则只能使用非匹配索引扫描。--... 查看详情

oracle查询不走索引的一些情况(索引失效)(代码片段)

...,则查询条件中必须包含索引中的引导列。比如一个复合索引包含A,B,C,D四列,则A为引导列(排在第一位置的列)。如果WHERE子句中所包含的列是BCD或者BD等情况,则只能使用非匹配索引扫描。--... 查看详情

mysql的复合索引,生效了吗?来篇总结文章(代码片段)

...索引来达到目的呢?这篇文章咱们来一探究竟。认识复合索引如果where条件中使用到多个字段,并且需要对多个字段建立索引,此时就可以考虑采用复合索引(组合索引)。比如查询地址时需要输入省、市࿰... 查看详情

复合索引的优点和注意事项(代码片段)

...上;  用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引);  复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引;  同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的... 查看详情

2021最新阿里java高级面试题总结,分享面经(代码片段)

数据库1.MySQL索引使用有哪些注意事项呢?可以从三个维度回答这个问题:索引哪些情况会失效,索引不适合哪些场景,索引规则索引哪些情况会失效查询条件包含or,可能导致索引失效如何字段类型是字符串&#... 查看详情

mysql从入门到精通高级篇(二十六)建了索引就能用么?我看未必。来看看几种索引失效的情况吧(代码片段)

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。💪🏻1.Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。Python从入门到精通❤️2.网上优质的Python题... 查看详情

面试官:谈谈mysql联合索引生效失效的条件?(代码片段)

...还是只简单的CV了事。联合索引失效的条件联合索引又叫复合索引。两个或更多个列上的索引被称作复合索引。对于复合索引:Mys 查看详情

oracle左连接索引失效,怎么解决

参考技术A可查询索引失效的几种常见情况,如类似转换、索引有碎片、统计信息不真实等。可关注:我是DBA(MyDBAHome) 查看详情

索引系列知识三:索引总结(代码片段)

一、前言前面二章我们讲解了《聚集索引与非聚集索引详解》、《联合索引、覆盖索引和索引下推详解》,大家可以点击查看。这一章我们对什么时候用索引、索引失效的情况进行总结,并编成一个顺口溜方便大家记忆... 查看详情

mysqlsql优化篇-关键字与索引(代码片段)

...sql性能使用索引提高查询效率普通索引主键索引唯一索引复合索引前缀索引sql关键字对索引的影响in不会使索引失效like部分情况会使索引失效and不会使索引失效,or会使索引失效使用explain查看sql性能##使用explain命令查看query... 查看详情

vector迭代器失效的几种情况

...访问等),但他又不仅仅是一种普通的指针。关于迭代器失效,我们可以看下面这个例子:#include<vector>#include<list>voidPrintVector(constvector<int>&v){  查看详情

[转]magento刷新索引的几种方法(代码片段)

....csdn.net/IT_Wallace/article/details/78513951在数据表中经常会使用索引,下面简单介绍一下索引的利弊:创建索引可以大大提高系统的性能:通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。可以大大加快数据的检索速度... 查看详情

submit的几种情况(代码片段)

1、最普通的用法*CodeusedtoexecuteareportSUBMITZreport.2、带select-options程序的Submit的用法*Codeusedtopopulate‘select-options‘&executereportDATA:seltabtypetableofrsparams,seltab_walikelineofseltab.seltab_wa-seln 查看详情