資料庫索引 執行計畫

2021-08-03 12:18:56 字數 3690 閱讀 2286

索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊(from 百科)

索引是一種特殊的檔案(innodb資料表上的索引是表空間的乙個組成部分),它們包含著對資料表裡所有記錄的引用指標。

其實可以這麼理解,索引就等於是字典的查詢目錄,你是在字海浬查東西快還是通過查詢目錄來查詢快呢,顯而易見。

索引種類:聚簇索引和非聚簇索引,聚簇索引是按照資料存放的物理位置為順序的。

注意:不是說索引越多就越好,索引會增加插入和更新表的開銷,對於經常要插入和更新缺很少查詢的表,建議不設定索引,所以具體情況需要具體分析。

普通索引

關鍵字index

------------------index-------------------

create index index_name on table_name(column_name(length))

alter

table table_name add index index_name on (column_name)

唯一索引

關鍵字unique index;

與普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值(注意和主鍵不同)。如果是組合索引,則列值的組合必須唯一,建立方法和普通索引類似

----------------------index-----------------------------

create

unique index index_name on table_name(column_name)

alter

table table_name add

unique index_name on (column_name)

----------------------create-----------------------

create

table

`table_name` (

`id`

int(11) not

null auto_increment ,

`title`

char(255) not

null ,

primary

key (`id`),

unique index_name (title)

);

主鍵索引

關鍵字primary key

必須為主鍵建立的唯一索引。、

primary key (`id`),
全文索引

關鍵字fulltext

作用於char、varchar或text,如果資料量大,建立索引耗時很嚴重。

-------------------fulltext-------------------------------

alter

table table_name add fulltext index_name(column_name)

create fulltext index index_name on table_name (column_name)

關鍵字index

建立多個欄位的一起查詢的索引。建立索引遵從最左字首原理,就是從最左邊開始組合。

alter

table article add index index_mul(first(20),second(20))

實際上的索引是:

first

first,second

最左字首原理

索引經驗值

動作描述

聚集索引

非聚集索引

列經常被分組排序

使用使用

返回某範圍內的資料

使用不使用

乙個或極少不同值

不使用不使用

小數目的不同值

使用不使用

大數目的不同值

不使用使用

頻繁更新的列

不使用使用

外來鍵列使用

使用列經常被分組排序

使用使用

主鍵列不使用使用

最好不要有null值

只要列中包含有null值都將不會被包含在索引中。復合索引中只要有一列含有null值,那麼這一列對於此復合索引就是無效的。

短索引

對串列進行索引,如果可能應該指定乙個字首長度。例如,如果有乙個char(255)的列,如果在前10個或20個字元內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁碟空間和i/o操作。

索引排序

mysql只會使用一次索引,where使用了索引的話,order by就不會使用索引。

不要再字段上進行運算

在字段上運算會導致索引失效。

like 語句操作

like %xx%會使索引失效,因為最左字首原因。like xx%則不會失效。

索引生效的操作

<,<=,=,>,>=,between,in,以及某些時候的like(不以萬用字元%或_開頭的情形)

資料庫中,使用explan命令就可以檢視詳細的sql語句的執行詳情,稱為執行計畫

舉例

explain select * from *** where ***=***

返回的結果如下(只做簡介)

id:查詢的序列號,越大表明越先執行。

select_type:查詢的型別,主要區別普通查詢和聯合查詢等:

table:輸出的行所引用的表,尖括號括起來表明是臨時表。

type:查詢的型別,表明是否使用了索引,和使用了什麼索引。

possible_key:查詢時可能使用到的索引。

key:查詢時真正使用的索引。

key_len:使用索引的長度,所有使用到的索引的總長度

ref:常數等值查詢,這裡會顯示const,如果是連線查詢,被驅動表的執行計畫這裡會顯示驅動表的關聯字段

rows:估算的掃瞄行數。

extra:擴充套件字段,可顯示的資訊非常多。

可參考的資料:

巨杉資料庫執行計畫和索引的使用

執行計畫 巨杉資料庫的執行計畫通過explain獲取,分成兩種,一種是未執行獲取的執行計畫,一種是已執行後獲取的執行計畫。兩種方式獲取的執行計畫詳情有所不同。索引 在巨杉早期的版本中,先建立的索引會被優先使用,這是不合理的,後面的版本不知道有沒有進行優化。可以通過hint進行指定使用哪個索引。執行計...

資料庫 資料庫索引

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

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

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