一.前言
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实现高性能的分页的。