SQL遇到的问题:

在数据库运行过程中,可能会遇到之前执行的SQL脚本突然变慢的情况。

出现这种情况的原因有很多,比如:

1.数据量激增到某一个点临界点时爆发;
2.缺少索引或是索引创建方式有问题;
3.出现锁等待或锁超时;
4.I/O的吞吐量不足;
5.网络带宽不足;
6.返回多余的列;
7.未做数据分区;
8.高并发;
9.表结构字段类型有问题;
10.数据库参数设置有问题。

此时就需要对SQL脚本进行优化或创建索引,修改表结构等。

索引相当于字典的目录。利用字典目录查找汉字的过程,就相当于利用SQL索引查找某条记录的过程。

SQL索引的好处

1.提高查询效率
2.降低CPU使用率

SQL索引的弊端

1.当数据量很大的时候,索引也会很大(当然相比于源表来说,还是相当小的)
2.索引并不适用于所有情况:a.少量数据;b.频繁进行改动的字段,不适合做索引;c.很少使用的字段,不需要加索引;
3.索引会提高数据查询效率,但是会降低“增、删、改”的效率。

几个优化小技巧

> 最佳字段做前缀,复合索引顺序和使用顺序一致,不要跨字段使用
> 添加索引的时候,要根据MySQL解析顺序添加索引
> 使用了in有时候会导致索引失效,尽量将in字段放在最后面。
> 不要在索引上进行任何操作(计算、函数、类型转换),否则索引失效
> 索引不能使用不等于(!= <>)或is null (is not null),否则自身以及右侧所有全部失效(针对大多数情况)。复合索引中如果有>,则自身和右侧索引全部失效。
> like尽量以“常量”开头,不要以’%'开头,否则索引失效
> 尽量不要使用类型转换(显示、隐式),否则索引失效
> 尽量不要使用or,否则索引失效
>如果主查询的数据集大,则使用in关键字,效率高。如果子查询的数据集大,则使用exist关键字,效率高。
> 避免使用select * …(select后面写所有字段,也比写*效率高)
> 用where字句替换HAVING字句

参考地址:

SQL优化常用的几种技巧方法笔记

更多推荐

SQL遇到的问题及优化建议