Sql的优化

Sql的优化

1.对查询进行优化, 要尽量避免全表扫描, 首先应该考虑在进行条件判断的字段上创建索引.

2.应尽量避免在 WHERE 子句中对字段进行 null 值判断, 否则将导致引擎放弃使用索引而进行全表扫描.

3.应尽量避免在 WHERE 子句中使用 != 或 <> 操作符, 否则将导致引擎放弃使用索引而进行全表扫描.

4.应尽量避免在 WHERE 子句中使用 OR 来连接条件, 如果一个字段有索引,一个字段没有索引,
将导致引擎放弃使用索引而进行全表扫描, 而应该使用 UNION ALL 代替实现

5.NOT IN 也要慎用, 否则会导致全表扫描, 应该用 NOT EXISTS 代替 NOT IN

6.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理

7.在 MySql 中模糊查询使用了 "%" 也将会导致全表扫描

8.应尽量避免在 WHERE 子句中对字段进行表达式计算操作,这将导致引擎放弃使用索引而进行全表扫描.

9.在使用索引作为条件时,如果索引是复合索引,
那么必须使用到该索引的第一个字段作为条件时才能保证系统使用该索引 (最左原则),
否则该索引将不会被使用,并且应尽可能与索引顺序一致,

10.Update 语句, 如果只更改1~2个字段, 不要 Update 全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志.

11.对于多张大数据量 (几百条) 的表连接 (多表连接查询) ,可以考虑使用程序去实现,
不要连接查询,就是尽量避开多表查询 (多表查询会出现的笛卡尔积)

12.索引并不是越多越好, 索引固然可以提高相应的 SELECT 的效率, 但同时也降低了, INSERT 及 UPDATE 的效率,
因为使用 INSERT 或 UPDATE 时有可能会重建索引, 索引怎样建索引需要慎重考虑, 视具体情况而定.

13.尽量使用数字型字段, 若只含数值信息的字段尽量不要设计为字符型, 这会降低查询的连接性能,并且会增加存储开销.
这是因为引擎在处理查询和连接时会逐个比较字符串中的每一个字符,而对于数字型的而言只需要比较一次就够了.

14.任何地方都不要使用 SELECT * FROM t , 用具体的字段列代表"*", 不要返回用不到的任何字段