對支付時間建立索引:
create
index idx_paydate on payment(payment_date)
;查詢:
select
max(payment_date)
from payment;
在一條sql中同時查出2023年和2023年電影的數量 - 優化count()函式:
對count函式使用的列做處理:
select
count
(release_year=
'2006'
ornull)as
'2023年電影數量'
,count
(release_year=
'2007'
ornull)as
'2023年電影數量'
from film;
通常情況下,需要把子查詢優化為join查詢,但在優化時要注意關聯鍵是否有一對多的關係,要注意重複資料。
查出sandra出演的所有影片:
select title from film where film_id in
(select film_id from film_actor where actor_id in
(select actor_id from actor where first_name=
'sandra'))
;優化為join查詢:
select
distinct title from
(film f join film_actor fa on f.id=fa.film_id)
join actor t on t.actor_id=fa.actor_id;
group by 可能會出現臨時表,檔案排序等,影響效率。可以通過關聯的子查詢,讓group by走索引,來避免產生臨時表和檔案排序,減少io。
查出每個演員出演的影片數量:
explain
select actor.first_name,
count(*
)from film_actor
inner
join actor using
(actor_id)
group
by film_actor.actor_id;
優化後查詢:
explain
select actor.first_name,c.cnt
from actor inner
join
(select actor_id,
count(*
)as cnt from film_actor group
by actor_id)
as c using
(actor_id)
;
limit常用於分頁處理,時常會伴隨order by從句使用,因此大多時候會使用到filesorts這樣會造成大量的io問題。
select film_id,description from film order
by title limit50,
5;優化1:使用有索引的列或主鍵進行order
by操作; 缺點:需要從頭開始,掃到50,如果數量大,時間也會長。
select film_id,description from film order
by film_id limit50,
5;優化2:記錄上次返回的主鍵,在下次查詢時使用主鍵過濾。好處是要多少掃多少,避免資料量大時掃瞄過多的記錄。
缺點是主鍵必須連續,不能空缺。
select film_id,description from film where film_id>
55and film_id<=
60order
by film_id limit1,
5;
1、在where從句,group by從句,order by從句,on從句**現的列
2、索引字段越小越好
3、離散度大的列放到聯合索引的前面,例如
select
*from payment where staff_id =
2and customer_id =
548;
由於customer_id有599個不同的值,離散度更大,所以聯合索引為index
(customer_id,staff_id)。
索引的維護及優化:消除重複及冗餘索引。重複索引是指相同的列以相同的順序建立的同型別的索引,如下圖primary key和id列上的索引就是重複索引。
如何查詢重複及冗餘索引?
使用pt-duplicate-key-checker工具檢查重複及冗餘索引:
pt-
duplicate
-key
-checker -uroot -p root -h 127.0
.0.1
結果分析:指出哪些索引是重複的,結尾還給出了刪除重複索引的操作。
刪除不用的索引:
可能因業務變更,有些索引不會再使用到了。可以通過慢查詢日誌配合pt-index-usage工具來進行索引使用情況的分析。
pt-
index
-usage
-uroot -proot mysql-slow.log
SQL及索引優化
一 問題sql篩選步驟 1 檢查慢日誌是否開啟 2 檢查慢日誌路徑 檢查慢日誌路徑 3 開始慢查詢日誌 set global slow query log on 4 慢日誌判斷標準 show variables like long query time 5 修改慢日誌判斷標準 由於實際專案中1秒左右...
Mysql 索引及優化
索引是什麼?相信大家都用過字典。你是怎麼從厚厚的新華字典中找到你需要找到的那個字的呢?又是怎麼從一本書中快速定位到你需要的章節?我們都是通過書中的目錄,然後根據目錄中的頁碼定位到我們要的資訊。同樣在mysql中也是這樣為我們準備了乙份目錄。當你去通過sql語句查詢的時候用不用索引,以及怎麼用索引。決...
mysql索引及優化
mysql的索引可以從不同的維度來進行區分,如下 這是最基本的索引型別,基於普通字段建立的索引,沒有任何限制。與 普通索引 類似,不同的就是 索引欄位的值必須唯一,但允許有空值 在建立或修改表時追加唯一 約束,就會自動建立對應的唯一索引。它是一種特殊的唯一索引,不允許有空值。在建立或修改表時追加主鍵...