sql性能优化

一.前言

  sql优化是个老生常谈的话题,本文会简单罗列一些在sql中可以用到的sql优化方法。

二.方法

1.创建索引

  当被问到sql查询优化问题,第一反应基本就是回答建索引了吧。索引是一种用于排序和搜索的结构,在查询数据库时可以减少对I/O的消耗。

2.优化查询语句

  1)在查询中不要使用select *,检索不必要的列带来额外的系统开销。

  2)尽量少用distinct,它会建立一个临时表,然后根据排序来删除重复数据,会增加数据库的I/O次数和时间消耗。

  3)在查询中要减少可能引用全表扫描的操作,比如or、like(‘%%‘)、in和not in都会引起全表扫描。

二.思路

  做sql性能优化,主要思路有两个个,1.合理设计数据表,如字段类型、建索引;2.查询语句优化。

三.方法

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

  2.应考虑在where及order by涉及的列上建立索引。

  3.尽量避免在where子句中对字段进行null值判断,否则将导致全表扫描。

  4.尽量避免在where子句中使用or来连接条件,否则会导致全表扫描。

select id from table where num =10 or num = 20
改写为
select id from table where num = 10 
union all
select id from table where num = 20

  5.尽量避免使用前置百分号。

select id from where name like %abc%

  6.in和not in需要慎用,很多时候可以用exists和not exists,否则会导致全表扫描。

  7.如果在where子句中使用参数,也会导致全表扫描。

select id from table where num = @num 
可以改为强制查询使用索引
select id from table with(index(索引名)) where num = @num

  8.尽量避免在where子句中对字段进行表达式操作,否则会导致全表扫描。

select id from table where num/2 = 100
应改为
select id from table where num = 100 *2

  9.尽量避免在where子句中对字段进行函数操作,否则将导致全表扫描。

select id from table where substring(name,1,3) = abc
应改为
select id from table where name like abc%

  10.并不是所有索引对查询都有效,sql根据表中数据来进行查询优化,当索引有大量数据重复时,sql查询可能不会去利用索引。

  11.索引并不是越多越好,索引提高了select效率,但是降低了insert和update的效率。一个表的索引数最好不要超过6个。

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

  13.尽可能使用varchar/nvarchar代替char/nchar,因为首先变长字段存储空间小,可以节省存储空间。其次对于查询来说,在一个相对较小得字段内搜索效率显然会高些。

  14.任何地方都不要使用select *,用具体的字段列表代替*,不要返回用不到的字段。

  15.尽量避免使用游标,因为游标得效率较差,如果游标操作的数据超过1万条,那么就要考虑改写。

  16.尽量避免大事务操作,提高系统并发能力。

  17.利用set rowcount实现高性能的分页的。

 

sql性能优化

上一篇:【Mysql】explain详解与索引最佳实践


下一篇:Redis的flushall/flushdb误操作