mysql中的索引

2021-10-12 13:00:01 字數 1982 閱讀 6172

索引是在儲存引擎中實現的,不同的儲存引擎會使用不同的索引。

單列索引(普通索引,唯一索引,主鍵索引)

普通索引:沒什麼限制,允許插入空值和重複值

唯一索引:不允許重複值,允許空值

主鍵索引:不允許空值,不允許重複值

組合索引(聯合索引)

遵循最左字首原則

eg:(a,b,c)建立索引,共有(a),(a,b),(a,b,c)三種索引

全文索引

innodb,myisam引擎都能用,只能在char,varchar,text型別的字段上加該索引。主要用來查詢文字中的關鍵字,而不是直接與字段值進行比較,全文索引需要配合match against使用,而不是一般的where like…

空間索引

是對空間資料型別的字段建立的索引,空間索引的列必須是not null,只有myisam支援該索引

因為記憶體的易失性,一般情況下,都會將表中的資料和索引儲存在磁碟這種外圍裝置中,但是和記憶體相比,從磁碟中讀取資料的速度會慢上千倍,從磁碟中讀取資料都是按照磁碟塊來讀,並不是一條一條的讀。

如果能盡量的把更多的資料放進磁碟裡,那麼一次讀取就能獲取更多資料,但是二叉樹每個節點就儲存乙個鍵值對,如果用這種結構儲存,那麼每次讀取乙個鍵盤只能讀到乙個鍵值對,如果儲存海量資料,占用磁碟過多,效率過慢。

為了解決這個弊端,建立了b樹,b樹是乙個節點可以儲存多個鍵值對的平衡樹。

圖中每個節點稱為頁,也就是磁碟塊,在mysql中讀取的基本單位都是頁。

假如要查詢id=9 的資料:

1、先找到根節點,發現9小於17,根據指標p1,找到頁2

2、將9和頁2中的資料進行標膠發現9在8和12之間,根據p2找到頁6

3、將9和頁6中的鍵值進行比較,找到(9,ac)

b+樹 和 b樹的區別

1、b+樹非葉子節點是不儲存資料的,僅儲存鍵值,因為資料庫中頁的大小是固定的,innodb預設是16k,如果不儲存資料,就會儲存更多的鍵值,另外,b+樹的階數等於鍵值的數量,如果b+樹的乙個節點可以儲存1000個鍵值,那麼三層的b+樹可以儲存100010001000 = 10億個資料。

一般節點是常駐記憶體的,所以一般查詢10億資料只需要兩次io。

2、b+樹的所有資料都儲存在葉子節點,而且資料時按照順序排列的,這就使得b+樹的範圍查詢,排序查詢,分組查詢,以及去重查詢變得簡單。

b+樹各個頁之間通過雙向鍊錶連線的,葉子節點之間資料通過單向鍊錶連線的,通過這些連線可以找到表中所有資料。

利用雜湊函式h(k)計算出元素的位置

hash索引的檢索效率很高,索引的減速偶可以一次定位,不像b樹索引需要從根節點到枝節點經過多次io。

hash索引缺點:

1、hash只支援等值比較查詢,如 = ,in,<=>。不支援任何範圍查詢,因為hash索引比較的值是經過hash運算之後的值,這些值的大小並不能保證和hash運算之前完全一樣。

2、hash也無法進行排序操作,原因同上。

3、hash索引在任何時候都不能避免表掃瞄,由於不同索引鍵存在相同hash值,所以即使滿足某個hash值,也無法完成直接查詢,而是要訪問表中的資料進行比較。

4.不支援聯合索引最左匹配原則。

1、用「or」分隔開的兩個條件,如果有乙個條件沒有索引,則不會使用索引

2、如果like以「%」開頭,則不會使用索引

3、如果列型別為字串,則where條件中該常量值必須加引號,否則索引不起作用

4、對索引列進行數**算或者函式,索引不起作用

eg:select * from … where id-1=9

select * from … round(id) = 10

MySQL索引,MySQL中索引的限制?

mysql中索引的限制 1 myisam儲存引擎引鍵的長度綜合不能超過1000位元組 2 blob和text型別的列只能建立字首索引 3 mysql目前不支援函式索引 4 使用!或者 的時候mysql不能使用索引 5 過濾字段使用了函式運算的時候如 abs key sum key 的時候mysql無...

mysql中的索引

mysql中的索引 什麼是索引?索引是對資料庫中某乙個表的資料進行排序,這種排序並不是真正的對錶中資料按照大小排序,而是另外再建立乙個索引檔案來存放包含btree資料結構,在資料結構中根據索引欄位的值排序,資料結構的值包括 索引欄位的值和索引對應資料行的位址。索引查詢就是先查詢這個索引檔案來獲得資料...

MySql中的索引

索引就是資料庫內部對某個表的所有資料預先進行的某種排序,以便於後面的快速查詢。作用 可以極大的加快資料的查詢速度 通常所謂的建立索引,就是指定乙個表的某個或某些字段作為 索引資料字段 就可以了,形式為 索引型別 要建立的索引的欄位名 create table if notexists 表名 欄位1,...