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