MySQL回表的性能傷害程度有多大
1 回表的性能消耗
無論單列索引 還是 聯(lián)合索引,一個索引就對應一個獨立的B+索引樹,索引樹節(jié)點僅包含:
- 索引里的字段值
- 主鍵值
即使根據索引樹按條件找到所需數(shù)據,也僅是索引里的幾個字段的值和主鍵值,萬一你搞個select *
,那就還得其他字段,就需回表,根據主鍵到聚簇索引里找,聚簇索引的葉節(jié)點是數(shù)據頁,找到數(shù)據頁才能把一行數(shù)據所有字段值讀出來。
所以類似
select * from table order by xx1,xx2,xx3
得從聯(lián)合索引的索引樹里按序取出所有數(shù)據,接著對每條數(shù)據都走一個主鍵的聚簇索引查找,性能不高。
有時MySQL
執(zhí)行引擎可能認為,你要是類似
select * from table order by xx1,xx2,xx3
相當于得把聯(lián)合索引和聚簇索引,兩個索引的所有數(shù)據都掃描一遍,那還不如不走聯(lián)合索引,直接全表掃描得了,這樣就只需掃描一個主鍵索引。
但若形如:
select * from table order by xx1,xx2,xx3 limit 10
那執(zhí)行引擎就知道你先掃描聯(lián)合索引的索引樹,拿到10條數(shù)據,接著對10條數(shù)據在聚簇索引里查找10次即可,那就還是會走聯(lián)合索引。
2 覆蓋索引
覆蓋索引不是一種索引,只是一種基于索引查詢的方式,即針對類似
select xx1,xx2,xx3 from table order by xx1,xx2,xx3
僅需聯(lián)合索引里的幾個字段的值,那就只需掃描聯(lián)合索引的索引樹,無需回表找其它字段,這種查詢方式就是覆蓋索引。
所以當你使用聯(lián)合索引時,注意是否可能會導致大量回表到聚簇索引,若回表聚簇索引的次數(shù)太多,可能就直接給你做成全表掃描而不走聯(lián)合索引了。
盡可能還是在SQL里指定你僅需要的字段,而不要暴力select *
,最好直接走覆蓋索引。
即使無可避免地要回表,你也盡可能用limit
、 where
限定一下回表的次數(shù),就從聯(lián)合索引里篩選少數(shù)數(shù)據,再回表,這樣性能好一點。
到此這篇關于MySQL回表的性能傷害程度有多大的文章就介紹到這了,更多相關MySQL回表的性能傷害內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL日期函數(shù)與時間函數(shù)匯總(MySQL 5.X)
這篇文章主要給大家介紹了關于MySQL 5.X日期函數(shù)與時間函數(shù)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12MySQL中VARCHAR與CHAR格式數(shù)據的區(qū)別
char是一種固定長度的類型,varchar則是一種可變長度的類型,那么他們具體使用過程中有什么區(qū)別嗎2015-09-09