MySQL優化 SQL及索引優化(二)

2021-10-04 19:03:04 字數 2938 閱讀 8026

對支付時間建立索引:

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的索引可以從不同的維度來進行區分,如下 這是最基本的索引型別,基於普通字段建立的索引,沒有任何限制。與 普通索引 類似,不同的就是 索引欄位的值必須唯一,但允許有空值 在建立或修改表時追加唯一 約束,就會自動建立對應的唯一索引。它是一種特殊的唯一索引,不允許有空值。在建立或修改表時追加主鍵...