SQL優化(變多次維護為一次維護) Sql優化分為:DDL、DML、DQL 一、DDL優化 1 、通過禁用索引來提供導入數據性能 。 這個操作主要針對有資料庫的表,追加數據 //去除鍵 alter table test3 DISABLE keys; //批量插入數據 insert into test ...
SQL優化(變多次維護為一次維護)
Sql優化分為:DDL、DML、DQL
一、DDL優化
1 、通過禁用索引來提供導入數據性能 。 這個操作主要針對有資料庫的表,追加數據
//去除鍵
alter table test3 DISABLE keys;
//批量插入數據
insert into test3 select * from test;
//恢復鍵
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
變多次事務提交為一次事務提交
二、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)
變多次事務提交為一次事務提交
三、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