-
sql语句大全之数据库调优笔记
一、建立索引
1.在经常要查询的列或者做where条件的列上建立索引可以避免扫描整个表。
2.当一列的值都不同时,也就是当“这一列不重复的值得数量/这一列的行数“的值”越接近1就越适合在这一列上建立索引,例如姓名、id每一行的值基本都不同,又例如性别只有两种结果每一行基本相同,所以适合在id、姓名的列上索引,不适合在性别列上加索引。
总结上两条就是在经常做条件表达式和不同值较多的列上建立索引。
3.频繁做更新、删除的表不要建立过多的索引,因为当你对表进行操作时同时也需要维护索引。
4.对没有重复值的列创建唯一索引比创建非唯一索引更好。
5.定义主键的列一定要建立索引,定义有外键的列一定要建立索引。
6.经常同时存取多列,且每列都含有重复值,可考虑复合索引并将使用频度高的字段放在前面。
7.在order by、group by、distinct关键字后面的列上建立索引,如果是复合索引,索引的字段顺序要和关键后面的字段顺序一致,否则索引不会被使用。
8.当数据库表更新大数据后,删除并重建索引来提高查询速度。
9.如果索引列是函数的参数,索引不会被使用。
10.hash join 由于必须做hash运算,索引的存在对数据查询速度几乎没有影响。
11.并行查询不会用到索引。
12.索引中存储值不能为全空。
13.尽量使用交窄的索引,这样数据页每页上能因存放较多的索引行而减少操作。
二、sql语句优化
1.同一个表有多个条件时,影响较大的条件放前面,影响较弱的放后面。这样就可以先筛选掉大部分数据再去找到满足条件的数据。
2.字段用多少去多少,避免select*这样的操作。当表中有很多列时,select*就会很耗时。
3.避免子查询,能用连接代替子查询的就用连接。因为对于主查询的每一条记录子查询都要执行一次,嵌套的层次越多效率越低。
4.避免使用!=(或<>)、IS NULL 或IS NOT NULL、IN、NOT IN等这样的操作符,避免在WHERE 子句中使用非聚合表达式。这些操作符会使系统无法使用索引。
5.避免使用or,用union代替。or语句的执行原理是先找到满足每个or子句条件的行存放到临时表里,再创建唯一索引去掉重复行,最后得到结果。使得索引可能失效,导致顺序扫描整个表。
6.在执行连接前,对关系进行适当的预处理,预处理的方法有两种,在连接属性上建立索引和对关系进行排序。
7.将一个大的查询拆分成多步执行查询。
8.如果应用程序使用循环,可考虑在查询内放入循环。