假設我們有表 user (id,name)列
我們知道,對於表的單列(如id)資料,是可以建立索引的,對於多列(id和name組合,或者,name和id組合),也可以建立索引。聯合索引,也稱之為組合索引。
先來看單列索引的邏輯結構。
由此得出索引的三個特徵:索引有序+高度較低+儲存列值
聯合索引也滿足這三個特徵,但這裡的邏輯圖就不畫了,而是以更直觀的方式來展現其查詢邏輯,這裡應注意,聯合索引的列有前後,以id列在前、name列在後為例。
建聯合索引前的情況
建聯合索引後的情況(先按id排序+再按name排序)
create index indexname on tablename(column1,column2,...,columnn),如create idx_un_userid_username on user(id,name)
聯合索引可以建立多列(列數大於2)的索引,建議列數最多不要越過3列,超過3列,應重新設計表。
a:避免回表
在執行計畫中,table access by index rowid代表是回表動作。
如在user的id列建有索引,select id from user這個不用回表,直接從索引中讀取id的值,而select id,name from user中,不能返回除id列其他的值,所以必須要回表。
如果建有了id和name列的聯合索引,則可以避免回表。
另外,建立了id和name的聯合索引(id列在在前),則select id from user可以避免回表,而不用單獨建立id列的單列索引。
b:兩個單列查詢返回行較多,同時查返回行較少,聯合索引更高效。
如果select * from user where id=2 和select * from user where name='tom' 各自返回的行數比較多,而select * from user where id=2 and name='tom'返回的行數比較少,那麼這個時候使用聯合索引更加高效。
a:等值查詢中,查詢條件a返回的條目比較多,查詢條件b返回的條目比較多,而同時查詢a、b返回的條目比較少,那麼適合建立聯合索引;
b:對於有等值查詢的列和範圍查詢的列,等值查詢的列建在前、範圍查詢的列建在後比較實用;
c:如第3點a中的另外說到,如果聯合索引列的前置列與索引單列一致,那麼單列查詢可以用到索引,這樣就避免了再建單列索引,因此聯合索引的前置列應盡量與單列一致;
insert:索引越多插入明顯慢得多,這是因為記錄必須與索引同時更新,而要維護索引那種有序排列的結構,就必須把新增的索引鍵值插入到特定的位置,而不是隨機排放,這裡就涉及到重 組資料的動作,如果索引塊存不下,如果索引塊存不下,則還要涉及到擴充套件索引塊的動作,這都需要很大的開銷。
相對於有序插入,無序插入時索引的影響更加驚人,因為有序插入時,由於插入的資料有一定的順序,可以在準備工作後快速擴充套件新塊和批量重組,而對於無序操作,批量則不可能。
delete:刪除影響所有的索引,在海量資料庫定位刪除少量記錄時,這個條件列是索引列顯然是必要的,但過多的索引還是會影響明顯,因為其他列的索引也要更新。在經常要刪除大量記錄的 時候,危害加劇。另外,delete刪除索引後,索引塊中的相關需要刪除記錄只是被打上了乙個刪除標誌而已,並沒有真正刪除。
update:更新的影響最小,如果是更新整條記錄則與delete類似,如果是修改某列時,則不會觸及到其他索引列的維護。
a:超過3個列的聯合索引不合適,否則雖然減少了回表動作,但索引塊過多,查詢時就要遍歷更多的索引塊了;
b:建索引動作應謹慎,因為建索引的過程會產生鎖,不是行級鎖,而是鎖住整個表,任何該錶的dml操作都將被阻止,在生產環境中的繁忙時段建索引是一件非常危險的事情;
c:對於某段時間內,海量資料表有頻繁的更新,這時可以先刪除索引,插入資料,再重新建立索引來達到高效的目的。
mysql 索引基本知識
一 索引的優點 1 減少不必要資料的掃瞄 2 幫助伺服器避免排序和臨時表 3 將隨機io變成順序io 二 索引的用處 1 快速查詢匹配where子句的行 2 在多個索引之間進行選擇,mysql通常會使用找到最少行的索引 雖然可以建立多個索引,但是mysql只會選擇其中乙個,這也就解釋組合索引出現 3...
MySQL索引基本知識
1 mysql的基本儲存結構是頁 記錄都存在頁裡面 每個資料頁可以組成乙個雙向鍊錶。而每個資料頁中的記錄又可以組成乙個單向鍊錶。2 每個資料頁都會為儲存在裡面的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應的槽,然後再遍歷該槽對應分組中的記錄即可快速找到指定的...
資料庫基本知識(三) 索引
索引是資料庫表中乙個或多個列的值進行排序的結構,建立索引通常能夠提高資料庫的效能,使查詢速度大 幅提高。同時索引的存在也為資料庫中的資料維護帶來負面影響,增加了資料庫與系統的資源消耗,因此數 據表中的索引不是越多越好,需要根據業務特性決定是否使用索引。常見索引 使用原則 經常出現在order by ...