SQL优化(变屡次维护为一次维护)html
Sql优化分为:DDL、DML、DQLsql
1、DDL优化数据库
1 、经过禁用索引来提供导入数据性能 。 这个操做主要针对有数据库的表,追加数据mybatis
//去除键性能
alter table test3 DISABLE keys;优化
//批量插入数据spa
insert into test3 select * from test;htm
//恢复键blog
alter table test3 ENABLE keys;排序
变屡次索引维护为一次索引维护
2、 关闭惟一校验
set unique_checks=0 关闭
//批量插入数据
insert into test3 select * from test;
set unique_checks=1 开启
变屡次惟一校验为一次惟一校验
3、修改事务提交方式(导入)
set autocommit=0 关闭# false
//批量插入
set autocommit=1 开启 true
变屡次事务提交为一次事务提交
2、DML优化
insert into test (name) values(2);
insert into test values(1,3);
insert into test values(1,4);
//合并多条为一条 mybatis的批量操做:
insert into test values(1,2),(1,3),(1,4)
变屡次事务提交为一次事务提交
3、DQL优化
(1) 1 order by优化
1、多用索引排序
2、普通结果排序(非索引排序)Filesort
索引自己就是排序的,因此多使用索引。
(2) group by优化
查询某个时间的付款总和
explain
select DATE_FORMAT(payment_date,'%Y-%m'),sum(amount) from payment GROUP BY DATE_FORMAT(payment_date,'%Y-%m') ;
explain
select DATE_FORMAT(payment_date,'%Y-%m'),sum(amount) from payment GROUP BY DATE_FORMAT(payment_date,'%Y-%m') order by null;
在group by是使用order by null,取消默认排序
(3) subQuery嵌套优化
在客户列表找到不在支付列表的客户
#在客户列表找到不在“支付列表”的客户 , 查询没买过东西的客户
explain
select * from customer where customer_id not in (select DISTINCT customer_id from payment);
explain
select * from customer c left join payment p on(c.customer_id=p.customer_id) where p.customer_id is null -- 这种是基于“索引”外链
(4) or优化
在两个独立索引上使用or的性能优于
1、 or两边都是用索引字段作判断,性能好!!
2、 or两边,有一边不用,性能差
3、 若是employee表的name和email这两列是一个复合索引,可是若是是 :name='A' OR email='B' 这种方式,不会用到索引!
(5) limit优化
select film_id,description from film order by title limit 50,5;
select a.film_id,a.description from filqm a inner join (select film_id from film order by title limit 50,5)b on a.film_id=b.film_id
30种sql语句优化:https://www.cnblogs.com/Little-Li/p/8031295.html