MySQL回表的性能傷害程度有多大
1 回表的性能消耗
無論單列索引 還是 聯合索引,一個索引就對應一個獨立的B+索引樹,索引樹節(jié)點僅包含:
- 索引里的字段值
- 主鍵值
即使根據索引樹按條件找到所需數據,也僅是索引里的幾個字段的值和主鍵值,萬一你搞個select *,那就還得其他字段,就需回表,根據主鍵到聚簇索引里找,聚簇索引的葉節(jié)點是數據頁,找到數據頁才能把一行數據所有字段值讀出來。
所以類似
select * from table order by xx1,xx2,xx3
得從聯合索引的索引樹里按序取出所有數據,接著對每條數據都走一個主鍵的聚簇索引查找,性能不高。
有時MySQL執(zhí)行引擎可能認為,你要是類似
select * from table order by xx1,xx2,xx3
相當于得把聯合索引和聚簇索引,兩個索引的所有數據都掃描一遍,那還不如不走聯合索引,直接全表掃描得了,這樣就只需掃描一個主鍵索引。
但若形如:
select * from table order by xx1,xx2,xx3 limit 10
那執(zhí)行引擎就知道你先掃描聯合索引的索引樹,拿到10條數據,接著對10條數據在聚簇索引里查找10次即可,那就還是會走聯合索引。
2 覆蓋索引
覆蓋索引不是一種索引,只是一種基于索引查詢的方式,即針對類似
select xx1,xx2,xx3 from table order by xx1,xx2,xx3
僅需聯合索引里的幾個字段的值,那就只需掃描聯合索引的索引樹,無需回表找其它字段,這種查詢方式就是覆蓋索引。
所以當你使用聯合索引時,注意是否可能會導致大量回表到聚簇索引,若回表聚簇索引的次數太多,可能就直接給你做成全表掃描而不走聯合索引了。
盡可能還是在SQL里指定你僅需要的字段,而不要暴力select *,最好直接走覆蓋索引。
即使無可避免地要回表,你也盡可能用limit、 where限定一下回表的次數,就從聯合索引里篩選少數數據,再回表,這樣性能好一點。
到此這篇關于MySQL回表的性能傷害程度有多大的文章就介紹到這了,更多相關MySQL回表的性能傷害內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決MySQL數據庫意外崩潰導致表數據文件損壞無法啟動的問題
這篇文章主要介紹了MySQL數據庫意外崩潰導致表數據文件損壞無法啟動的問題及解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
mysql 5.7.18 安裝配置方法圖文教程(CentOS7)
這篇文章主要為大家詳細介紹了CentOS 7下mysql 5.7.18 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04

