您当前的位置: 首页 > 宏观 >

面试官:讲讲MySql索引失效的几种情况-天天快资讯

来源: 2023-06-29 14:33:36
索引失效准备数据:
CREATE TABLE `dept` (`id` INT(11) NOT NULL AUTO_INCREMENT,`deptName` VARCHAR(30) DEFAULT NULL,`address` VARCHAR(40) DEFAULT NULL,ceo INT NULL ,PRIMARY KEY (`id`)) ENGINE=INNODB AUTO_INCREMENT=1;CREATE TABLE `emp` (`id` INT(11) NOT NULL AUTO_INCREMENT,`empno` INT NOT NULL ,`name` VARCHAR(20) DEFAULT NULL,`age` INT(3) DEFAULT NULL,`deptId` INT(11) DEFAULT NULL,PRIMARY KEY (`id`)#CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `t_dept` (`id`)) ENGINE=INNODB AUTO_INCREMENT=1;
1、计算、函数导致索引失效
-- 显示查询分析EXPLAIN SELECT * FROM emp WHERE emp.name  LIKE "abc%";EXPLAIN SELECT * FROM emp WHERE LEFT(emp.name,3) = "abc"; --索引失效
2、LIKE以%开头索引失效
EXPLAIN SELECT * FROM emp WHERE name LIKE "%ab%"; --索引失效

拓展:Alibaba《Java开发手册》

【强制】页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。


(相关资料图)

3、不等于(!= 或者<>)索引失效
EXPLAIN SELECT * FROM emp WHERE emp.name = "abc" ;EXPLAIN SELECT * FROM emp WHERE emp.name <> "abc" ; --索引失效
4、IS NOT NULL 和 IS NULL
EXPLAIN SELECT * FROM emp WHERE emp.name IS NULL;EXPLAIN SELECT * FROM emp WHERE emp.name IS NOT NULL; --索引失效

注意:当数据库中的数据的索引列的NULL值达到比较高的比例的时候,即使在IS NOT NULL 的情况下 MySQL的查询优化器会选择使用索引,此时type的值是range(范围查询)

-- 将 id>20000 的数据的 name 值改为 NULLUPDATE emp SET `name` = NULL WHERE `id` > 20000;-- 执行查询分析,可以发现 IS NOT NULL 使用了索引-- 具体多少条记录的值为NULL可以使索引在IS NOT NULL的情况下生效,由查询优化器的算法决定EXPLAIN SELECT * FROM emp WHERE emp.name IS NOT NULL;

测试完将name的值改回来

UPDATE emp SET `name` = rand_string(6) WHERE `id` > 20000;
5、类型转换导致索引失效
EXPLAIN SELECT * FROM emp WHERE name="123"; EXPLAIN SELECT * FROM emp WHERE name= 123; --索引失效
6、全值匹配我最爱

准备:

-- 首先删除之前创建的索引CALL proc_drop_index("atguigudb","emp");

问题:为以下查询语句创建哪种索引效率最高

-- 查询分析EXPLAIN SELECT * FROM emp WHERE emp.age = 30 and deptid = 4 AND emp.name = "abcd";-- 执行SQLSELECT * FROM emp WHERE emp.age = 30 and deptid = 4 AND emp.name = "abcd";-- 查看执行时间SHOW PROFILES;

创建索引并重新执行以上测试:

-- 创建索引:分别创建以下三种索引的一种,并分别进行以上查询分析CREATE INDEX idx_age ON emp(age);CREATE INDEX idx_age_deptid ON emp(age,deptid);CREATE INDEX idx_age_deptid_name ON emp(age,deptid,`name`);

结论:可以发现最高效的查询应用了联合索引 idx_age_deptid_name

7、最佳左前缀法则

准备:

-- 首先删除之前创建的索引CALL proc_drop_index("atguigudb","emp");-- 创建索引CREATE INDEX idx_age_deptid_name ON emp(age,deptid,`name`);

问题:以下这些SQL语句能否命中 idx_age_deptid_name索引,可以匹配多少个索引字段

测试:

如果索引了多列,要遵守最左前缀法则。即查询从索引的最左前列开始并且不跳过索引中的列。过滤条件要使用索引,必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用。
EXPLAIN SELECT * FROM emp WHERE emp.age=30 AND emp.name = "abcd" ;-- EXPLAIN结果:-- key_len:5 只使用了age索引-- 索引查找的顺序为 age、deptid、name,查询条件中不包含deptid,无法使用deptid和name索引EXPLAIN SELECT * FROM emp WHERE emp.deptid=1 AND emp.name = "abcd";-- EXPLAIN结果:-- type: ALL, 执行了全表扫描-- key_len: NULL, 索引失效-- 索引查找的顺序为 age、deptid、name,查询条件中不包含age,无法使用整个索引EXPLAIN SELECT * FROM emp WHERE emp.age = 30 AND emp.deptid=1 AND emp.name = "abcd";-- EXPLAIN结果:-- 索引查找的顺序为 age、deptid、name,匹配所有索引字段EXPLAIN SELECT * FROM emp WHERE emp.deptid=1 AND emp.name = "abcd" AND emp.age = 30;-- EXPLAIN结果:-- 索引查找的顺序为 age、deptid、name,匹配所有索引字段
8、索引中范围条件右边的列失效

准备:

-- 首先删除之前创建的索引CALL proc_drop_index("atguigudb","emp");

问题:为以下查询语句创建哪种索引效率最高

EXPLAIN SELECT * FROM emp WHERE emp.age=30 AND emp.deptId>1000 AND emp.name = "abc"; 

测试1:

-- 创建索引并执行以上SQL语句的EXPLAINCREATE INDEX idx_age_deptid_name ON emp(age,deptid,`name`);-- key_len:10, 只是用了 age 和 deptid索引,name失效

注意:当我们修改deptId的范围条件的时候,例如deptId>100,那么整个索引失效,MySQL的优化器基于成本计算后认为没必要使用索引了,所以就进行了全表扫描。(注意:因为表中的数据是随机生成的,因此实际测试中根据具体数据的不同测试的结果也会不一样,最终是否使用索引由优化器决定)

测试2:

-- 创建索引并执行以上SQL语句的EXPLAIN(将deptid索引的放在最后)CREATE INDEX idx_age_name_deptid ON emp(age,`name`,deptid);-- 使用了完整的索引

补充:以上两个索引都存在的时候,MySQL优化器会自动选择最好的方案

上一篇 下一篇
x
推荐阅读 更多
面试官:讲讲MySql索引失效的几种情况-天天快资讯

索引失效 准备数据:```sqlCREATETABLE`dept`(`id`INT(11)NOTNULLA

博客园 2023-06-29
环球热资讯!双色球第23074期数据分析及晒票!10倍投小复式能否实现亿元巨奖梦

时间来到6月29号周四,福彩双色球将在今晚进行第23074期的开奖。随着近

酷易软件园 2023-06-29
2023全球AI指数排名公布:美中稳居前二 亚洲国家表现亮眼 焦点快播

6月29日消息,英国传媒机构TortoiseMedia近日发布了2023年全球AI指数排

IT之家 2023-06-29
三菱化学:锂离子电池电解液制造技术在印度授权 世界短讯

【三菱化学:锂离子电池电解液制造技术在印度授权】财联社6月29日电,

财联社 2023-06-29
事关食品安全!海南印发《细则》,8月1日起施行

商报全媒体讯(椰网 海拔新闻记者徐明锋)6月29日上午,记者从海南省市

海拔新闻 2023-06-29
“扬帆计划”文学沙龙在京举办

本报电(记者张鹏禹)近日,由中国作家协会主办、中国作家协会新时代文

人民日报海外版 2023-06-29
快看:百度识图搜索_百图识图

你们好,最近小品发现有诸多的小伙伴们对于百度识图搜索,百图识图这个

互联网 2023-06-29
荆州联通完善工程建设领域合规管理体系|世界通讯

为贯彻落实国资委提质效、强合规、防风险管理要求,切实保障中国联通集

人民邮电报 2023-06-29
环球百事通!保险业高质量发展“五本账”系列报道 |保险业渠道“效益账”:代理人“减与加”有门道

张大伟制图在近年来的寿险业高质量改革转型中,代理人渠道作为寿险主渠

上海证券报 2023-06-29
长沙湘潭书写地铁“双城记”-环球微头条

长株潭城轨西环线一期工程正式开通运行,20余分钟实现两市互联互通——

华声在线 2023-06-29