索引是儲存引擎用於快速找到記錄的一種資料結構,這是索引的基本功能。可以把資料庫的理解成一本書,而索引就是這本書的索引(每個章節在第幾頁),如果你知道你想查詢的章節名稱,就可以快速的通過索引找到這一章索引的頁數,而在資料庫中也類似,儲存引擎會先在索引中找到對應的值(主鍵或者實體地址,不同的儲存引擎儲存的值不同),然後根據這個值找到對應的資料行。
現在可以知道索引對於查詢資料的重要性,乙個設計合理的索引可以很大程度的加快查詢的速度,尤其在資料量很大的時候,索引對效能的影響也就更加重要了。
但是如何設計(或者優化現有)高效能索引有一些需要注意的地方:
使用自增的id作為表的主鍵(可以把主鍵理解成乙個為空的唯一索引),這樣做的好處是,可以保證資料按順序寫入(只在最後插入資料),如果索引不是順序的話,在插入資料時,儲存引擎要先找到需要插入的位置(可能還會進行也**),然後插入資料,這就增加了cpu的負載。
設計覆蓋索引,覆蓋索引就是索引中包含所有需要查詢的字段的值,因為這樣做的話可以避免資料庫再回表查詢,大大節約了查詢效率。
選擇合適的索引列順序,如果索引中字段的順序和查詢欄位的順序不一致,會導致索引無法工作,因為索引按照最左匹配原則,即資料庫會按照從左至右逐個匹配索引列。
使用索引掃瞄來做排序,因為當只需要從一條索引記錄順序移到下一條索引記錄(但是要保證查詢欄位和索引字段相同,否則回回表查詢索引中不包含的字段),只有當索引的列順序和order by 子句的順序完全一致,並且所有列的排序規則都相同時(都是正序,或者都是倒序),才能夠使用索引進行排序。
避免使用多個範圍查詢,有範圍查詢的,也要把相關欄位寫在索引的最後,因為當匹配到第乙個範圍查詢(id > 100 and age < 25)時,資料庫不會匹配接下來的字段(只匹配到id>100)。
避免重複和冗餘索引,雖然mysql允許在相同列上建立多個索引,例如(index1(name,age,***),index2(name,age,country)),但這樣mysql需要單獨維護重複的索引,並且優化器在優化查詢的時候也需要逐個進行考慮,這會影響查詢效能。
當然不是所有的索引都需要遵循上面的規則,需要根據具體情況設計最合理的索引,沒有必須遵守的規則。
mysql高效能索引 mysql高效能索引( )
在開發中,我們知道大多數應用的瓶頸在於sql語句的執行時耗,在這裡並不討論sql語句的安全,僅僅討論高效能sql語句,而與高效能sql語句緊密相連的就是傳說中的 索引。索引 一種工作在儲存引擎端的用於快速找到記錄的一種資料結構。mysql使用索引的方式是 先找到索引的值,再根據索引的值找到資料行。索...
高效能mysql(一) 建立高效能索引
單列索引和多列索引 單列索引 多個單列索引的選擇問題 多個or條件 多個單列的效能往往效能很低,盡量建立高效的多列索引。多列索引 選擇合適的索引順序 避免範圍條件 在where子句中,in是有效的,範圍條件會導致後面的索引無效!在order by中,範圍條件和in都會導致無法按照索引排序!按照索引順...
MySQL資料高效能索引
索引 類似資料的目錄,mysql儲存引擎使用類似方式進行查詢,先去索引找到對應的值,然後根據匹配的索引找到對應的資料行 索引對效能的影響 大大減少伺服器需要掃瞄的資料量。比如我們資料表1000條資料。我們只需要根據條件查詢其中的一條,我們針對這一列建立乙個索引,我們只需要掃瞄著一條就可以了。如果不建...