資料庫索引與提高

2022-07-26 22:54:15 字數 2369 閱讀 4156

索引是在儲存引擎中實現的,也就是說不通的儲存引擎,會使用不同的索引,myisam 和 innodb 儲存引擎:

只支援 b-tree 索引。

memory / heap 儲存引擎: 支援hash 和 b - tree 索引

mysql 的索引分為單列索引(主鍵索引,唯一索引,普通索引)和組合索引

單列索引: 乙個索引值包含乙個列,乙個表可以有多個單列索引

組合索引: 乙個組合索引包含兩個或兩個以上的列

最基本的索引,沒有任何限制,myisam 中預設的b-tree型別的索引,也是我們大多數情況下用到的索引

與普通索引類似,不同的就是索引列必須唯一,但允許有空值,如何是組合索引,則列值的組合必須唯一

fulltext 索引僅可作用域myisam表,他們可以從char,varchar,或者text 列中作為 create table 語句的一部分被建立,或是隨後使用alter table 或者 create index 被新增,對於較大的資料集,將你的資料輸入乙個沒有fulltext 索引的表中,然後建立索引,其速度比把資料舒服現有fulltext 的速度更快,不過切記,對於大容量的資料庫,生成全文索引是乙個非常消耗時間非常消耗磁碟空間的做法。

多個單列索引與單個多列索引的查詢效果不同,因為執行查詢時,mysql只能使用乙個索引,會從多個索引中選擇乙個限制最為嚴格的索引。平時用的sql查詢語句一般都有比較多的限制條件,所以為了進一步榨取mysql的效率,就要考慮建立組合索引。例如上表中針對title和time建立乙個組合索引:alter table article add index index_titme_time (title(50),time(10))。建立這樣的組合索引,其實是相當於分別建立了下面兩組組合索引:–title,time–title為什麼沒有time這樣的組合索引呢?這是因為mysql組合索引「最左字首」的結果。簡單的理解就是只從最左面的開始組合。並不是只要包含這兩列的查詢都會用到該組合索引

create index nickname_account_createdtime_index on `award`(`nickname`, `account`, `created_time`);

​例如上面這個索引,我們直接根據 account 或者 created_time查詢時,不會使用到改索引

也就是建立了組合索引,如果在查詢的時候,不符合最左原則,該索引是會失效的,不會走這個索引

在建立索引的時候應該考慮索引應該建立在資料庫表中的某些列上面 哪一些索引需要建立,哪一些所以是多餘的.一般來說,1.在經常需要搜尋的列上,可以加快索引的速度2.主鍵列上可以確保列的唯一性3.在表與表的而連線條件上加上索引,可以加快連線查詢的速度4.在經常需要排序(order by),分組(group by)和的distinct 列上加索引 可以加快排序查詢的時間, (單獨order by 用不了索引,索引考慮加where 或加limit)5.在一些 where 之後的 <, <=, >, >=, between in 以及某個情況下的like 建立欄位的索引(b-tree)6.like語句的 如果你對nickname欄位建立了乙個索引.當查詢的時候的語句是 nickname lick '%abc%' 那麼這個索引講不會起到作用.而nickname lick 'abc%' 那麼將可以用到索引

也就是說使用like 進行模糊查詢的時候,如何查詢的那個匹配條件是用 % 開頭的,該索引也會失效

7.索引不會包含null列,如果列中包含null值都將不會被包含在索引中,復合索引中如果有一列含有null值那麼這個組合索引都將失效,一般需要給預設值0或者 ' '字串

8.使用短索引,如果你的乙個欄位是char(32)或者int(32),在建立索引的時候指定字首長度 比如前10個字元 (前提是多數值是唯一的..)那麼短索引可以提高查詢速度,並且可以減少磁碟的空間,也可以減少i/0操作.

9.不要在列上進行運算,這樣會使得mysql索引失效,也會進行全表掃瞄

10.選擇越小的資料型別越好,因為通常越小的資料型別通常在磁碟,記憶體,cpu,快取中 占用的空間很少,處理起來更快

1.查詢中很少使用到的列 不應該建立索引,如果建立了索引然而還會降低mysql的效能和增大了空間需求.2.很少資料的列也不應該建立索引,比如 乙個性別字段 0或者1,在查詢中,結果集的資料佔了表中資料行的比例比較大,mysql需要掃瞄的行數很多,增加索引,並不能提高效率3.定義為text和image和bit資料型別的列不應該增加索引,4.當表的修改(update,insert,delete)操作遠遠大於檢索(select)操作時不應該建立索引,這兩個操作是互斥的關係

1.如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什麼盡量少用or的原因)

注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引

2.對於多列索引,不是使用的第一部分,則不會使用索引, 也就是組合索引不符合最左原則,索引會失效

3.like查詢是以%開頭

資料庫稠密索引與稀疏索引

一 稠密索引 如果記錄是排好序的,我們就可以在記錄上建立稠密索引,它是這樣一系列儲存塊 塊中只存放記錄的鍵以及指向記錄本身的指標,指標就是乙個指向記錄或儲存塊位址。稠密索引檔案中的索引塊保持鍵的順序與檔案中的排序順序一致。既然我們假定查詢鍵和指標所佔儲存空間遠小於記錄本身,我們就可以認為儲存索引檔案...

資料庫 資料庫索引

索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...

資料庫mysql索引 資料庫 mysql索引

mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...