為什麼索引能提高查詢速度
先從 mysql的基本儲存結構說起
mysql的基本儲存結構是頁 (記錄都存在頁裡邊) :
各個資料頁可以組成乙個雙向鍊錶
每個資料頁中的記錄又可以組成乙個單向鍊錶- 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應的槽,然後再遍歷該槽對應分組中的記錄即可快速找到指定的記錄
所以說,如果我們寫select * from user where indexname = '***'這樣沒有進行任何優化的sql語句,缺省會這樣做:定位到記錄所在的頁:需要遍歷雙向鍊錶,找到所在的頁
從所在的頁內中查詢相應的記錄:由於不是根據主鍵查詢,只能遍歷所在頁的單鏈表了
很明顯,在資料量很大的情況下這樣查詢會很慢!這樣的時間複雜度為o(n)。
索引做了些什麼可以讓我們查詢加快速度呢?****其實就是將無序的資料變成有序(相對):
要找到id為8的記錄簡要步驟:
很明顯的是:沒有用索引我們是需要遍歷雙向鍊錶來定位對應的頁,現在通過 「目錄」 就可以很快地定位到對應的頁上了!(二分查詢,時間複雜度近似為o(logn))
其實底層結構就是b+樹,b+樹作為樹的一種實現,能夠讓我們很快地查詢出對應的記錄。
什麼是最左字首原則?
mysql中的索引可以以一定順序引用多列,這種索引叫作聯合索引。如user表的name和city加聯合索引就是(name,city),而最左字首原則指的是,如果查詢的時候查詢條件精確匹配索引的左邊連續一列或幾列,則此列就可以被用到。如下:select * from user where name=xx and city=xx ; //可以命中索引
這裡需要注意的是,查詢的時候如果兩個條件都用上了,但是順序不同,如 city= xx and name =xx,那麼現在的查詢引擎會自動優化為匹配聯合索引的順序,這樣是能夠命中索引的。
由於最左字首原則,在建立聯合索引時,索引欄位的順序需要考慮字段值去重之後的個數,較多的放前面。order by子句也遵循此規則。
注意避免冗餘索引
冗餘索引指的是索引的功能相同,能夠命中就肯定能命中 ,那麼 就是冗餘索引如(name,city )和(name )這兩個索引就是冗餘索引,能夠命中後者的查詢肯定是能夠命中前者的 在大多數情況下,都應該盡量擴充套件已有的索引而不是建立新索引。
mysqls.7 版本後,可以通過查詢 sys 庫的 schema_redundant_indexes 表來檢視冗餘索引
mysql如何為表字段新增索引?
1.新增primary key(主鍵索引)alter table `table_name` add primary key ( `column` )
2.新增unique(唯一索引)alter table `table_name` add unique ( `column` )
3.新增index(普通索引)alter table `table_name` add index index_name ( `column` )
4.新增fulltext(全文索引)alter table `table_name` add fulltext ( `column`)
5.新增多列索引alter table `table_name` add index index_name ( `column1`, `column2`, `column3` )
mysql 索引深入理解 深入理解MySql的索引
為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...
深入理解mysql索引
三 b tree 索引是幫助mysql高效獲取資料的排好序的資料結構。mysql中索引預設的資料結構為b tree。新建兩張表test innodb 儲存引擎為innodb test myisam 儲存引擎為myisam 當進入到mysql安裝目錄下的data資料夾可以看到test innodb.f...
深入理解MySQL索引 上
簡單來說,索引的出現就是為了提高資料查詢的效率,就像字典的目錄一樣。如果你想快速找乙個不認識的字,在不借助目錄的情況下,那我估計你的找好長時間。索引其實就相當於目錄。索引的出現是為了提高查詢效率,但是實現索引的而方式有很多種,所以這裡也就引入了索引模型的概念。可以用於提高查詢效率的資料結構有好多種,...