SQL优化 总结 精简

来源:互联网 发布:在淘宝上面卖什么好 编辑:程序博客网 时间:2024/06/05 05:51
 

索引:
  考虑在 where order by 涉及的列上建立索引

  经常同时存取多列,且每列都含有重复值可考虑建立组合索引,且查询越频繁的字段放前面

  按需使用聚集与非聚集索引,聚集不适合频繁更新、适合范围查询( > ,< ,> =,< =)order bygroup by,注意复合索引的顺序,选择性高的建议放前面
  不要在数据选择性不高的字段建立索引
  索引控制在6个以内为好
  大字段可以考虑使用前缀索引
  去除冗余索引

where子句的操作:

  尽量避免在 where子句中对字段进行 null值判断、!=<>操作符、or 来连接条件、innot inlike%在前面、使用参数,如where num=@num

  表达式操作,如where num/2=100、函数操作(“=”左边进行函数),如substring(name,1,3)='abc';#name、算术运算或其他表达式运算

  exists代替 in
  一个查询中避免多个范围查询
  where子句中的数据扫描不超过表总数据量的30%


表结构:

  能用数字和枚举类型就不用其他类型

  使用 varchar/nvarchar代替 char/nchar

  字段尽可能的使用 NOT NULL
  IP地址存成UNSIGNED INT
  固定长度的表会更快
  越小的列会越快


临时表:

  用变量就不要用临时表

  避免频繁创建和删除临时表

  需要重复引用大型表或常用表中的某个数据集时可用临时表

  新建临时表时,如果一次性插入数据量很大,用 select into代替 create table

  注意删除临时表,先 truncate table ,然后drop table


其他:
  不使用select *

  大量数据时不适合用游标处理

  在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置SET NOCOUNT OFF

  定期ANALYZECHECKOPTIMIZE

  EXPLAIN 你的 SELECT 查询

  善用LIMIT 避免一次性查询大量数据

  在Join表的时候使用相同类型的列,并将其索引

  千万不要 ORDER BY RAND()

  除了关联表 永远为每张表设置一个ID

  Prepared Statements小心永久链接
  尽量避免大事务操作

  拆分大的 DELETEINSERT insert .. into .. select..语句 减少锁表时间

  使用orm
  使用缓存,例如一级缓存,二级缓存、redismemcace分布式

  合理用运分库、分表与分区表提高数据存放和提取速度