概述sql
以前寫過一篇Mysql B+樹學習,簡單的介紹了B+數以及MySql使用B+樹的緣由,
有了這些基礎知識點,對MySql索引的類型以及索引使用的一些技巧,就比較容易理解了。數據庫
覆蓋索引bash
建立了一個輔助索引,若是能直接從這個輔助索引文件中獲取到數據,而無需去訪問彙集索引(自增主鍵索引)文件的話,那麼這中就用到索引覆蓋了。
這種的效率是極其高的。函數
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複製代碼
部分同窗會以爲直接使用單列索引便可,爲啥非要使用聯合索引。其實從我上面舉得例子就能夠發現,只是使用單列索引的話,雖然也是用到了索引,可是常常會回溯到彙集索引,仍是有性能損耗的,尤爲是還要加上排序等操做,那就更慢了。這裏再舉一個例子,分頁查詢ui
select id,code from xxxx order by age limit 50000,10;複製代碼
若是隻是在age列創建索引的話,這個SQL查詢的效率不高,可是創建(age,code)怎樣的聯合索引,就無需回溯到彙集索引,即可完成操做。spa
簡單枚舉值的列不要創建索引.net
某個列的值只有0和1,爲這種列創建輔助索引就大可沒必要,由於沒任何區分度,好比說按照0來找,從B+數中能夠找到一大堆數據,性能差。
索引列不要參與計算
B+數存的是key和數據,如要查詢的時候,須要對樹中的數據先計算後再比較,代價太大了,也極其的慢,所以索引列使用了函數,壓根就沒法用到索引,MySql也不支持這樣作。
能擴展索引就擴展,儘可能別新建
聯合索引的好處已經在上面有提到了,若是數據庫有a索引,如今b列也須要索引,那麼直接創建(a,b)便可。由於像b=11或者b in (11,22)這種查詢,
MySql是會優化的,能夠用到索引的,能夠放心使用。
原文連接