1、说到SQL优化,不少人就知道利用索引,可是当利用索引以后,查询速度仍是慢怎么解决?
一、利用Explain查看sql运行是否使用了索引,
二、sql优化以下
1)、like语句查询时,全表查询,索引不会生效;
2)、where子句中使用 != 或 <>操做符,索引不会生效;
如: SQL:SELECT id FROM A WHERE ID != 1
优化成:SELECT id FROM A WHERE ID>1 OR ID<1
3)、where子句中使用 IS NULL 或 IS NOT NULL,索引不会生效;
如: SQL:SELECT id FROM A WHERE num IS NULL
优化成num上设置默认值0,确保表中num没有null值,
而后SQL为:SELECT id FROM A WHERE num=0
4)、使用union all(查询全部,有重复) 或 nuin(查询时,去除重复数据,性能慢)替换or;
SQL:SELECT id FROM A WHERE num =10 or num = 20
优化成:SELECT id FROM A WHERE num = 10 union all SELECT id FROM A WHERE num=20
5)、in和not in替换;
方案一:between替换in
如SQL:SELECT id FROM A WHERE num in(1,2,3)
优化成:SELECT id FROM A WHERE num between 1 and 3
方案二:exist替换in(in 是在内存中遍历比较,exist 须要查询数据库,因此当B的数据量比较大时,exists效率优于in.)
如SQL:SELECT id FROM A WHERE num in(select num from b )
优化成:SELECT num FROM A WHERE num exists(select 1 from B where B.num = A.num)
6)、不要在where子句中的“=”左边进行函数、算数运算或其余表达式运算,不然系统将可能没法正确使用索引;
如SQL:SELECT id FROM A WHERE num/2 = 100
优化成:SELECT id FROM A WHERE num = 1002
7)、用具体的字段列表替换"";
8)、使用“临时表”暂存中间结果,避免屡次扫描主表;
9)、limit分页优化,当偏移量特别时,limit效率会很是低;
如:SELECT id FROM A LIMIT 90000,10
优化后:select id from A order by id limit 90000,10
10)、批量插入优化 ;
INSERT into person(name,age) values('test',1),('test',2),('test',3)
11)、Inner join 和 left join、right join、子查询。
查询性能Inner join>left join/right join>子查询sql