如SQL:SELECT id FROM A WHERE num/2 = 100 优化成:SELECT id FROM A WHERE num = 100*2
如SQL:SELECT id FROM A WHERE substring(name,1,3) = 'abc' 优化成:SELECT id FROM A WHERE LIKE 'abc%'
如SQL:SELECT id FROM A WHERE datediff(day,createdate,'2016-11-30')=0 优化成:SELECT id FROM A WHERE createdate>='2016-11-30' and createdate<'2016-12-1'
如SQL:SELECT id FROM A WHERE year(addate) <2016 优化成:SELECT id FROM A where addate<'2016-01-01'
九、任何地方都不要用 select * from table ,用具体的字段列表替换"*",不要返回用不到的字段
十、使用“临时表”暂存中间结果
采用临时表暂存中间结果好处:
(1)避免程序中多次扫描主表,减少程序执行“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。
(2)尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
(3)避免频繁创建和删除临时表,以减少系统资源的浪费。
(4)尽量避免向客户端返回大数据量,若数据量过大,应考虑相应需求是否合理。
十一、limit分页优化
当偏移量特别时,limit效率会非常低
SELECT id FROM A LIMIT 1000,10 很快
SELECT id FROM A LIMIT 90000,10 很慢
优化方法:
方法一:select id from A order by id limit 90000,10; 很快,0.04秒就OK。 因为用了id主键做索引当然快
方法二:select id,title from A where id>=(select id from collect order by id limit 90000,1) limit 10;
方法三:select id from A order by id between 10000000 and 10000010;
十二、批量插入优化
INSERT into person(name,age) values('A',14)
INSERT into person(name,age) values('B',14)
INSERT into person(name,age) values('C',14)
可优化为:
INSERT into person(name,age) values('A',14),('B',14),('C',14),
十三、利用limit 1 、top 1 取得一行
有时要查询一张表时,你知道只需要看一条记录,你可能去查询一条特殊的记录。可以使用limit 1 或者 top 1 来终止数据库索引继续扫描整个表或索引。
如SQL:SELECT id FROM A LIKE 'abc%' 优化为:SELECT id FROM A LIKE 'abc%' limit 1
十四、尽量不要使用 BY RAND()命令
BY RAND()是随机显示结果,这个函数可能会为表中每一个独立的行执行BY RAND()命令,这个会消耗处理器的处理能力。
如SQL:SELECT * FROM A order by rand() limit 10 优化为:SELECT * FROM A WHERE id >= ((SELECT MAX(id) FROM A)-(SELECT MIN(id) FROM A)) * RAND() + (SELECT MIN(id) FROM A) LIMIT 10
List resultSet={};
Array A=(select * from A);
for(int i=0;i<A.length;i++) {
if(exists(A.id) { //执行select 1 from B where B.id=A.id是否有记录返回
resultSet.add(A);
}
}
return resultSet;