国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

Mysql性能優化案例研究-覆蓋索引和SQL_NO_CACHE

2024-07-24 12:45:08
字體:
來源:轉載
供稿:網友

場景

產品中有一張圖片表pics,數據量將近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,這兩個字段也在聯合索引中,這就實現了“覆蓋索引”,可以根據這個聯合索引一次性完成查詢工作,所以提升了性能。

擴展研究

一、Mysql緩存,SQL_NO_CACHE和SQL_CACHE 的區別

上邊在進行測試的時候,為了防止讀取緩存造成對實驗結果的影響使用到了SQL_NO_CACHE這個功能,對于SQL_NO_CACHE的介紹官網如下:

復制代碼 代碼如下:

SQL_NO_CACHE means that the query result is not cached. It does not mean that the cache is not used to answer the query.
You may use RESET QUERY CACHE to remove all queries from the cache and then your next query should be slow again. Same effect if you change the table, because this makes all cached queries invalid.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泰和县| 呼和浩特市| 贡山| 阿瓦提县| 吉木萨尔县| 大连市| 萝北县| 读书| 溧阳市| 阆中市| 祁门县| 沙雅县| 昌乐县| 勃利县| 四会市| 白沙| 陆川县| 祥云县| 兴国县| 新化县| 桂阳县| 泰兴市| 株洲市| 土默特左旗| 大港区| 梅州市| 双流县| 噶尔县| 印江| 昭通市| 行唐县| 徐汇区| 太和县| 建瓯市| 璧山县| 新化县| 西丰县| 靖远县| 绥江县| 宾阳县| 扶绥县|