您的位置:首页 > 数据库

简单SQL优化小记

2016-01-15 01:56 197 查看
简单SQL优化小记

http://www.douban.com/note/345871485

http://zhidao.baidu.com/link?url=udYO_-_r1EhdmKUJCx2o_R_uaysZuX6YHiJNSIfz_MYYozLTa7DBcQ5hdf6TJs04vFB9h3p174MGOq4PDaErQq

思路小记:避免使用模糊的匹配尽量匹配精确的值。

like,or,in,is null语句可能会全表扫描而放弃索引。

注:

or语句在连接子条件时如果某一个条件没有索引那么所有将导致所有条件放弃索引,使用全表扫描。
like语句在条件为"%..."时会放弃索引而全表扫描,而"...%"则走索引。

记:

<>,!=也会引起全表扫描(不等于可以替换成or连接,例:x<>'zhy' 替换成 x<'zhy' or x>'zhy')。
避免在查询时对where语句的条件列参数进行计算或者函数运算,否则将导致全表扫描(等号'='的左边不要进行表达式计算)。
在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
可以使用exists代替in语句。
创建索引会提高查询时的效率,但是会降低insert和update的效率。
更新时语句尽量只写经常更新的字段,不然会造成开销浪费还会生成很多不必要的日志。
建表时尽量使用数字型的字段,少用字符型字段。
尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
避免使用select *,要把所需要的字段一一列全。
少使用临时表。
在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。
尽量先分页再JOIN。
使用select count(column)代替select count(*)(后者是全表扫描)。
count(*) 跟 count(1) 的结果一样,都包括对NULL的统计,而count(column)
是不包括NULL的统计。
当MySQL认为符合条件的记录在30%以上,它就不会再使用索引,因为mysql认为走索引的代价比不用索引代价大,所以优化器选择了自己认为代价最小的方式(注意是认为,是MySQL的估算预期)。

例:

select column from table_a where p=1 or p=2;

可优化为:

select column from table_a where p=1

union all

select column from table_a where p=2;

union all语句会保留两个查询结果的所有记录,union语句则会去重。

例:

select column from table_a where p in (3,4,5);

可优化为:

select column from table_a where p between 1 and 3;

例:

select column from table_a where p/100=2;

可优化为:

select column from table_a where p=100*2;

例:

select column from table_a where p in (select column from table_b);

可以优化为:

select column from table_a a where exists(select 1 from table_b where column=a.column);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息