Mysql 索引知識點

Sam同學發表於2017-09-20

概述


之前寫過一篇Mysql B+樹學習,簡單的介紹了B+數以及MySql使用B+樹的原因,
有了這些基礎知識點,對MySql索引的型別以及索引使用的一些技巧,就比較容易理解了。


覆蓋索引


建立了一個輔助索引,如果能直接從這個輔助索引檔案中獲取到資料,而無需去訪問聚集索引(自增主鍵索引)檔案的話,那麼這中就用到索引覆蓋了。
這種的效率是極其高的。

select a from table xxx where b = 2複製程式碼

像上面這個語句,如果只是為列b建立索引,那麼執行這個SQL是可以用到索引的,但是由於a列的資料並沒有在這個b索引中,索引需要再次訪問聚集索引檔案。
如果建立(b,a)這樣的聯合索引,那麼這個聯合索引檔案就會包含了a列和b列的值,這樣執行上面的語句,就可以用到索引覆蓋了。


聯合索引


聯合索引就是多列索引,存在的目的是為了提高查詢效能


CREATE TABLE `xxxx` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '自增',
  `code` int(10),
  `age` int(10),
  PRIMARY KEY (`id`),
  KEY `code` (`code`)
) ENGINE=InnoDB複製程式碼

部分同學會覺得直接使用單列索引即可,為啥非要使用聯合索引。其實從我上面舉得例子就可以發現,只是使用單列索引的話,雖然也是用到了索引,但是經常會回溯到聚集索引,還是有效能損耗的,尤其是還要加上排序等操作,那就更慢了。這裡再舉一個例子,分頁查詢

select id,code from xxxx order by age limit 50000,10;複製程式碼

如果只是在age列建立索引的話,這個SQL查詢的效率不高,但是建立(age,code)怎樣的聯合索引,就無需回溯到聚集索引,便可完成操作。


簡單列舉值的列不要建立索引


某個列的值只有0和1,為這種列建立輔助索引就大可不必,因為沒任何區分度,比如說按照0來找,從B+數中可以找到一大堆資料,效能差。


索引列不要參與計算


B+數存的是key和資料,如要查詢的時候,需要對樹中的資料先計算後再比較,代價太大了,也極其的慢,因此索引列使用了函式,壓根就無法用到索引,MySql也不支援這樣做。


能擴充套件索引就擴充套件,儘量別新建


聯合索引的好處已經在上面有提到了,如果資料庫有a索引,現在b列也需要索引,那麼直接建立(a,b)即可。因為像b=11或者b in (11,22)這種查詢,
MySql是會優化的,可以用到索引的,可以放心使用。


原文連結


Mysql 索引知識點

相關文章