SQL优化 总结 精简

  • A+
所属分类:数据库

索引:

  1. 考虑在 where 及 order by 涉及的列上建立索引
  2. 经常同时存取多列,且每列都含有重复值可考虑建立组合索引,且查询越频繁的字段放前面
  3. 按需使用聚集与非聚集索引,聚集不适合频繁更新、适合范围查询( > ,< ,> =,< =)和order by、group by,注意复合索引的顺序,选择性高的建议放前面
  4. 不要在数据选择性不高的字段建立索引
  5. 索引控制在6个以内为好
  6. 大字段可以考虑使用前缀索引
  7. 去除冗余索引

 

where子句的操作:

  1. 尽量避免在 where子句中对字段进行 null值判断、!=或<>操作符、or 来连接条件、in和 not in、lke时%在前面、使用参数,如where num=@num、
  2. 表达式操作,如where num/2=100、函数操作(“=”左边进行函数),如substring(name,1,3)='abc';#name、算术运算或其他表达式运算
  3. exists代替 in一个查询中避免多个范围查询where子句中的数据扫描不超过表总数据量的30%

表结构:

能用数字和枚举类型就不用其他类型,使用 varchar/nvarchar代替 char/nchar字段尽可能的使用 NOT NULL;把IP地址存成UNSIGNED INT固定长度的表会更快越小的列会越快。

临时表:

  1. 能用变量就不要用临时表
  2. 避免频繁创建和删除临时表
  3. 需要重复引用大型表或常用表中的某个数据集时可用临时表
  4. 新建临时表时,如果一次性插入数据量很大,用 select into代替 create table
  5. 注意删除临时表,先 truncate table ,然后drop table

其他:

  1. 不使用select *大量数据时不适合用游标处理
  2. 在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置
    SET NOCOUNT OFF
  3. 定期ANALYZE、CHECK、OPTIMIZE表EXPLAIN
  4. 你的 SELECT 查询善用LIMIT 避免一次性查询大量数据在Join表的时候使用相同类型的列,并将其索千万不要 ORDER BY RAND()
  5. 除了关联表 永远为每张表设置一个ID
  6. Prepared Statements小心“永久链接”尽量避免大事务操作拆分大的 DELETE或 INSERT 或 insert .. into .. select..语句 减少锁表时间
  7. 使用orm,使用缓存,例如一级缓存,二级缓存、redis、memcace分布式合理用运分库、分表与分区表提高数据存放和提取速度

 

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: