mysql索引失效情况总结(未完)
  06PagLd5y8mb 2023年11月02日 25 0


-- 对于所有本应该走索引的,当mysql发现通过索引扫描的行记录数超过全表的10%-30%时,优化器可能会放弃走索引,自动变成全表扫描
-- 1. =走索引,!=、<>也走索引
explain select id2 from user where varchar_short4  = '0';            						--  = 范围小,肯定走索引。ref。key_len=11
explain select id2 from user where varchar_short4  = '0000';										--  = 范围大,肯定走索引。ref
explain select id2 from user where varchar_short4 != '0000';										-- != 范围小,    走索引。range
explain select id2 from user where varchar_short4 != '0';												-- != 范围大,  不走索引。
-- 2. <、>、>=、<= 和 between、not between均走索引
explain select id2 from user where varchar_short4 <=  '0';   								  	-- <= 范围小,  走索引。range
explain select id2 from user where varchar_short4 <= '0000';   									-- <= 范围大,不走索引。
explain select id2 from user where varchar_short4 	  between 'a' and 'z';  		--     between 范围小,  走索引。range
explain select id2 from user where varchar_short4 		between '0' and 'z';			--     between 范围大,不走索引。
explain select id2 from user where varchar_short4 not between '0' and 'z';			-- not between 范围小,  走索引。range
explain select id2 from user where varchar_short4 not between 'a' and 'z';			-- not between 范围大,不走索引。
-- 3.in走索引,not in走索引,in 1个值时同=。in 1个变量,自动转为=。
explain select id2 from user where varchar_short4     in ('0');									--     in 范围小,肯定走索引。ref
explain select id2 from user where varchar_short4     in ('0000');							--     in 范围大,肯定走索引。ref
explain select id2 from user where varchar_short4     in ('0','1');							--     in 范围小,    走索引。range
explain select id2 from user where varchar_short4     in ('0000','1');					--     in 范围大,  不走索引。
explain select id2 from user where varchar_short4 not in ('0000');	   					-- not in 范围小,    走索引。range
explain select id2 from user where varchar_short4 not in ('0');			    				-- not in 范围大,  不走索引。
-- 4.exists走索引,not exists不走索引【需细化】
explain select id2 from user o where exists (select 1 from user where id =o.id and varchar_short4 ='0');		--     exists范围小,    走索引。ref
explain select id2 from user o where exists (select * from user where varchar_short4 =o.varchar_short4 and varchar_short4 ='0');	--     exists范围小,   走索引。ref
explain select id2 from user o where exists (select * from user where varchar_short4 =o.varchar_short4 and varchar_short4 ='0000');	--     exists范围大,  不走索引。
explain select id2 from user o where not exists (select id2 from user where varchar_short4 =o.varchar_short4 and varchar_short4 ='0000');		-- not exists肯定不走索引。
-- 5.null,同=
explain select id2 from user where varchar_short6 is     null;									-- is     null 范围小,  走索引。ref
explain select id2 from user where varchar_short5 is     null;									-- is     null 范围大,  走索引。ref
explain select id2 from user where varchar_short5 is not null;									-- is not null 范围小,  走索引。range,
explain select id2 from user where varchar_short6 is not null;									-- is not null 范围大,不走索引。
-- like 
explain select id2 from user where varchar_short4     like 'a';									--        like前缀 范围小,  走索引。range
explain select id2 from user where varchar_short4     like '0000';							--        like前缀 范围大,不走索引。
explain select id2 from user where varchar_short4     like 'a%';								--        like前缀 范围小,  走索引。range
explain select id2 from user where varchar_short4     like '0000%';							--        like前缀 范围大,不走索引。
explain select id2 from user where varchar_short4     like '%a';								--        like后缀 范围小,不走索引。
explain select id2 from user where varchar_short4 not like '0000%';							--        like前缀 范围小,不走索引。
-- distinct
explain select distinct varchar_short4 from user;																-- 范围小,走索引。range
explain select distinct varchar_mid2 from user;																						-- 范围大,走索引。range
explain select distinct varchar_short3 from user;
-- order by
explain select id2 from user order by varchar_short4 limit 1000;								-- 走索引。index
explain select id2 from user order by varchar_short3 limit 1000;
-- group by
explain select varchar_short4 from user group by varchar_short4 limit 1000;			-- 走索引。range
explain select varchar_short3 from user group by varchar_short3 limit 1000;
-- having。having是group by后,属于聚合函数,肯定不走索引
explain select varchar_short2 from user group by varchar_short2 having varchar_short2 = '00';			-- 不走索引
explain select varchar_short1 from user group by varchar_short1 having varchar_short1 = '00';			
-- and/or
explain select id2 from user where varchar_short4 = '0' and varchar_short5 = '0';		-- 走索引。index_merge 。key_len=11,11
explain select id2 from user where varchar_short4 = '0' or  varchar_short5 = '0';		-- 走索引。index_merge 。key_len=11,11
-- 类型隐式转换
explain select id2 from user where varchar_short4 = '11';						-- 无类型转换,  走索引
explain select id2 from user where varchar_short4 =  11 ;						-- 有类型转换,不走索引。对于varchar,查的数据也是错的
explain select id2 from user where id = '11';												-- 无类型转换,  走索引
explain select id2 from user where id =  11;												-- 无类型转换,  走索引
-- 函数、运算、两列比较
explain select id2 from user where lower(varchar_short4) = '00';		-- 函数,不走索引
explain select id2 from user where varchar_short4 || '0' = '00';		-- 函数,不走索引
explain select id2 from user where id + 1 = 100;										-- 运算,不走索引
explain select id2 from user where id = 100 - 1;										-- 不运算,走索引
explain select id2 from user where varchar_short4 = varchar_short5;	-- 两列比较,不走索引
-- 联合索引。最左匹配原则。与where 后面的字段顺序无关,sql优化器会自动调整。其它情况与单字段索引类type、失效原则一致
explain select id2 from user2 where varchar_short7 = '0' and varchar_short8 = '0' and varchar_short9 = '0';				--   走索引,key_len=33
explain select id2 from user2 where varchar_short9 = '0' and varchar_short8 = '0' and varchar_short7 = '0';				--   走索引,key_len=33
explain select id2 from user2 where varchar_short9 = '0' and varchar_short8 = '0' and varchar_short7 = '0';				--   走索引,key_len=33
explain select id2 from user2 where varchar_short7 = '0' and varchar_short8 = '0';																--   走索引,key_len=22
explain select id2 from user2 where varchar_short7 = '0' and varchar_short9 = '0';																--   走索引,key_len=11
explain select id2 from user2 where varchar_short7 = '0';																													--   走索引,key_len=11
explain select id2 from user2 where varchar_short8 = '0' and varchar_short9 = '0';																-- 不走索引
explain select id2 from user2 where varchar_short8 = '0';																													-- 不走索引
explain select id2 from user2 where varchar_short9 = '0';																													-- 不走索引
explain select id2 from user2 where varchar_short7 in( '0','1');																									--   走索引,key_len=11
explain select id2 from user2 where varchar_short7 in( '0','1') and varchar_short8 = '0' and varchar_short9 = '0';--   走索引,key_len=33
explain select id2 from user2 where varchar_short7 > '1';																													--   走索引,key_len=11
explain select id2 from user2 where varchar_short7 > '1'        and varchar_short8 = '0' and varchar_short9 = '0';--   走索引,key_len=33
explain select id2 from user2 where varchar_short7 like '1%'																											--   走索引,key_len=11
explain select id2 from user2 where varchar_short7 like '1%' and varchar_short8 = '0' and varchar_short9 = '0';		--   走索引,key_len=33
explain select id2 from user2 where varchar_short7 = '0' or  varchar_short8 = '0';																-- 不走索引

explain select id2 from user ;

explain select * from user where bigint2 = 1 limit 1;
explain select distinct id2 from user where id2  > '1';
explain select id2 from user limit 100,1;

select * from user;

explain select id2 from user where id2   = '1';            										--  =范围小,肯定走索引。const
explain select id2 from user where id2  != '1';            										--  =范围小,肯定走索引。const


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
06PagLd5y8mb