常去想想以前的东西,怀旧不是用感伤的,是温故知新,加油!!!
一、分析一个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索引处理的不是很好