Mysql索引优化+小案例

Mysql索引优化+小案例_第1张图片
表结构:
Mysql索引优化+小案例_第2张图片
索引结构:
Mysql索引优化+小案例_第3张图片
数据:

Mysql索引优化+小案例_第4张图片
(1)like查询是以%开头的,会走全表扫描
Mysql索引优化+小案例_第5张图片
(2)查询条件中带有or,即使带有索引的那些列也失效了。
Mysql索引优化+小案例_第6张图片(3)如果列类型是字符串,那在查询条件中需要将数据用引号引用起来,否则不走索引。其实最常用的就是如果这一列存储的是数字,那么我们一般就忘记加引号了,这就会导致不走索引查询。
Mysql索引优化+小案例_第7张图片
Mysql索引优化+小案例_第8张图片
(4)在索引列上参与计算会导致索引失效!计算包括(+,-,*,/,! 等)
Mysql索引优化+小案例_第9张图片

(5)违背最左匹配原则会导致索引失效:大家可以参考一下这篇文章写的特别详细:
https://blog.csdn.net/dout123/article/details/110578068?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-110578068-blog-115899479.t5_download_0_7w&spm=1001.2101.3001.4242.1&utm_relevant_index=3

(6)如果mysql估计全表扫描要比使用索引要快,会不适用索引!

(7)对索引列使用函数,会导致索引失效
Mysql索引优化+小案例_第10张图片
(8)说到这里前面还有一个问题正好补充:就是对索引隐式类型转换
Mysql索引优化+小案例_第11张图片
Mysql索引优化+小案例_第12张图片
Mysql索引优化+小案例_第13张图片
Mysql索引优化+小案例_第14张图片
(9)应尽量避免在 where 子句中使用 != 操作符,否则引擎将放弃使用索引而进行全表扫描。
Mysql索引优化+小案例_第15张图片
(10)in 和 not in 也要慎用,否则会导致全表扫描(能用 between 就不要用 in)
Mysql索引优化+小案例_第16张图片
Mysql索引优化+小案例_第17张图片

(11)很多时候用 exists 代替 in 是一个好的选择:exists用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值true或false。

select num from a where num in(select num from b)

用下面的语句替换:select num from a where exists (select 1 from b where num=a.num)
Mysql索引优化+小案例_第18张图片

(12)任何地方都不要使用 select from t ,用具体的字段列表代替“”,不要返回用不到的任何字段。

(13)10.用>=替代>

高效: SELECT * FROM EMP WHERE DEPTNO >=4

低效: SELECT * FROM EMP WHERE DEPTNO >3

两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录,而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录。

(14)用Where子句替换having子句
在这里插入图片描述

总结:
(1)利用like进行模糊查询,并且用%开头
(2)采用or查询,且查询条件中包含非索引列
(3)对索引列进行计算操作
(4)对索引列进行函数查询
(5)对于联合查询,违背最左匹配原则
(6)索引隐式类型转换
(7)避免使用 != 操作符进行查询
(8)in 和 not in 也要慎用,否则会导致全表扫描(能用 between 就不要用 in)
(9)根据具体的情况合理选择exists和in
(10)用>=代替>
(11)任何地方都不要使用 select from t
(12)用Where子句替换having子句,主要节省了分组时间,因为having语句是对分组后的数据记性过滤!!

你可能感兴趣的:(Java配置,架构模式,mysql,数据库,sql)