Mysql 索引知識點

2021-07-26 16:49:30 字數 1699 閱讀 8122

概述

之前寫過一篇mysql b+樹學習,簡單的介紹了b+數以及mysql使用b+樹的原因,

有了這些基礎知識點,對mysql索引的型別以及索引使用的一些技巧,就比較容易理解了。

覆蓋索引

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

這種的效率是極其高的。

select a from

table *** where b = 2

像上面這個語句,如果只是為列b建立索引,那麼執行這個sql是可以用到索引的,但是由於a列的資料並沒有在這個b索引中,索引需要再次訪問聚集索引檔案。

如果建立(b,a)這樣的聯合索引,那麼這個聯合索引檔案就會包含了a列和b列的值,這樣執行上面的語句,就可以用到索引覆蓋了。

聯合索引

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

create

table

`***x` (

`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 ***x 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是會優化的,可以用到索引的,可以放心使用。

1、mysql 覆蓋索引

2、mysql索引原理及慢查詢優化

mysql索引優化知識點

想要了解索引的優化方式,必須要對索引的底層原理有所了解 索引的用處 索引的分類 面試技術名詞 索引採用的資料結構 索引匹配方式 create table staffs id int primary key auto increment,name varchar 24 not null default...

索引知識點

索引 概念 對資料表中一列或多列的值進行排序後的一種結構,其作用就是提高表中資料的查詢速度。1.普通索引 由key或index定義的索引,是基本索引型別,可以建立任何資料型別中,其值是否唯一和非空由字段本身的約束條件所決定。2.唯一性索引 由unique定義的索引,該索引所在欄位的值必須是唯一的。3...

索引知識點

b tree索引 位圖索引 反向索引 函式索引 降序索引 分割槽索引 使用不等於操作符 使用is null或is not null 使用函式 比較不匹配的資料型別 復合索引中的前導列沒有被作為查詢條件 查詢的數量是大表的大部分 對小表查詢 like 百分號在前 位圖索引 b tree索引 適合與決策...