1.避免使用全表扫描
2.避免在where子句中对字段进行null值判断,可以设置该字段的默认值未0
3.避免在where子句中使用!=或<>,导致放弃使用索引而使用全表扫描
4.避免在where子句中使用or来连接查询,导致放弃使用索引而使用全表扫描
5.避免使用in或not in,否则导致使用全表扫描,能用between就不要用in
6.select id from t where name like '%abc%'将导致全表扫描
7.避免在 where 子句中对字段进行表达式操作,导致引擎放弃使用索引而进行全表扫描
select id from t where num/2=100 应改为: select id from t where num=100*2
8.避免在where子句中对字段进行函数操作,导致引擎放弃使用索引而进行全表扫描
elect id from t where substring(name,1,3)='abc'--name以abc开头的id 应改为: select id from t where name like 'abc%'
9.不要在where子句中“=”左边进行函数,算数运算以及表达式运算,否则系统可能无法正常使用索引
10.在使用索引作为条件时,若索引是复合索引,那么必须使用该索引的第一个字段作为条件,才能保证使用到该索引
11.不要写没有意义的查询会消耗系统的资源
12.用exists代理in
select num from a where num in(select num from b) 用下面的语句替换: select num from a where exists(select 1 from b where num=a.num)
13.当列中有大量重复数据的时候,不要定义该列为索引
14.索引不是越多越好,视情况而定,否则会降低insert和update的效率
15.尽量使用数字型字段,否则会影响查询和连接的性能
16.尽量使用varchar代理char以节省存储空间
17.不要使用select * ...
18.避免频繁的创建和删除临时表,减少系统表的资源消耗
19.临时表对于需要重复引用大型表或常用表中的某个数据集时,可以使用,但对于一次性事件,最好使用导出表
20.在新建临时表时,若需要一次性插入大量的数据,可以使用select intodaiticreate table,避免造成大量的log,若数据量小,可以先create table,然后insert
21.在使用临时表时,在存储过程的最后必须将所有的临时表显示删除,先truncate table,然后drop table,避免系统表的长时间锁定
22.尽量避免使用游标,因为游标的效率较差,若游标操作的数据超过1万行,就应该考虑改写
23.在使用游标和临时表之前,应先考虑集的方法,因为集的方法更有效
24.对于小数据集使用FAST_FORWARD游标要优于其他逐行处理方法,尤其是要引用几个表才能获取所需的数据时
25.避免使用大事务操作,提高系统的并发能力
26.避免向前端返回的数据量过大,若数据量过大,应该考虑相应的需求是否合理