MYSQL --SQL优化流程

时间:2022-08-12 06:05:07

常去想想以前的东西,怀旧不是用感伤的,是温故知新,加油!!!


一、分析一个SQL:


1.先看表结构,美化一下,一个好看的结构会让人心旷神怡


2.对复杂的SQL进行分析

(1)尽量将复杂的SQL拆成几个简单的查询

(2)尽量使用表连接,减少使用过 in/not in

(3)尽量减少子查询的使用或者将其合并出来

(4)尽量将 in/ not in /exists/not exists变为 join 语句,减少/合并子查询


3.从MySQL 5.6开始,子查询处理变得相对智能,利用其进行优化

(1)注意空值变化

(2)适当进左连接

(3)将SQL进行不同方式灵活转换,测试性能


4.查看慢查询日志,主要看两个地方

i. Row examined(最终要依据)

ii. Query time


5.SQL对系统可扩展性的影响

是否产生了慢查询,产生全表扫描,时间
中间件的影响


二、 分析SQL表连接图,画出拓扑图,找出主外键:


三、 找出返回数据最少的那张表


四、是否有高效索引

1、 高效索引:where条件都在索引上,或者通过索引过滤更多的数据,减少通过索引访问数据的再次过滤

2、有索引的where条件通过索引访问表上的数据

3、没有索引的where条件是通过where过滤数据


五、在表连接顺序确定的情况下,确定被连接的表是否存在索引


六、进一步查看是否覆盖索引


七、对索引效果不好的情况,是否需要进行表分区?


八、是否进行逆范式化进行?


九、对表进行水平和垂直拆分

注意:必须有主键,尽量保证业务的均匀分配,优先考虑tps


十、注意书写规范!!!!!!!

1.%开头的问题!!!

2.字符列上面没有加引号!!!

where条件不能有计算与函数处理 !!


十一、索引失效原因

1.没有查询条件,或者查询条件没有建立索引

2.查询条件上没有使用引导列,多列索引没有正确被使用(where条件没有写前导列)

3.查询的数量是大表的大部分

如果有主键索引,都要走主键索引
对于二级索引,如果访问量大,会全表扫描

4.索引本身失效

5.查询条件使用函数或者计算

6.对于小表进行查询

7.忽略索引的问题

8.隐式转换导致索引失效!!!!!

数字列不害怕隐式转换
字符列害怕隐式转换

9.<>不等于号不一定不走索引

10.%开头的情况,索引一定失效

11.not in /not exists 多数情况下不走索引

12.当变量是times类型,表字段是data的时候,或相反情况下,索引失效。而且如果数据填充进去也不对

13.注意非空的情况,B-tree索引处理的不是很好