程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> Mysql性能優化案例 - 覆蓋索引分享

Mysql性能優化案例 - 覆蓋索引分享

編輯:關於MYSQL數據庫

場景

產品中有一張圖片表,數據量將近100萬條,有一條相關的查詢語句,由於執行頻次較高,想針對此語句進行優化

表結構很簡單,主要字段:

復制代碼 代碼如下:
user_id 用戶ID
picname 圖片名稱
smallimg 小圖名稱

一個用戶會有多條圖片記錄

現在有一個根據user_id建立的索引:uid

查詢語句也很簡單:取得某用戶的圖片集合

復制代碼 代碼如下:
select picname, smallimg
from pics where user_id = xxx;

優化前

執行查詢語句(為了查看真實執行時間,強制不使用緩存)

復制代碼 代碼如下:
select SQL_NO_CACHE picname, smallimg
from pics where user_id=17853;

執行了10次,平均耗時在40ms左右

使用explain進行分析
復制代碼 代碼如下:
explain select SQL_NO_CACHE picname, smallimg
from pics where user_id=17853

使用了user_id的索引,並且是const常數查找,表示性能已經很好了

優化後

因為這個語句太簡單,sql本身沒有什麼優化空間,就考慮了索引

修改索引結構,建立一個(user_id,picname,smallimg)的聯合索引:uid_pic

重新執行10次,平均耗時降到了30ms左右

使用explain進行分析

看到使用的索引變成了剛剛建立的聯合索引,並且Extra部分顯示使用了'Using Index'

總結

'Using Index'的意思是“覆蓋索引”,它是使上面sql性能提升的關鍵

一個包含查詢所需字段的索引稱為“覆蓋索引”

MySQL只需要通過索引就可以返回查詢所需要的數據,而不必在查到索引之後進行回表操作,減少IO,提高了效率

例如上面的sql,查詢條件是user_id,可以使用聯合索引,要查詢的字段是picname smallimg,這兩個字段也在聯合索引中,這就實現了“覆蓋索引”,可以根據這個聯合索引一次性完成查詢工作,所以提升了性能

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved