Mysql索引的使用 詳細講解

2021-09-14 02:14:39 字數 3647 閱讀 6041

1.索引的簡介

索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可以提高資料庫中特定資料的查詢速度。
2.索引的含義和特點

索引是乙個單獨的、儲存再磁碟上的資料庫結構,它們包含著對資料表裡所有記錄的飲用指標。
2.1索引的儲存引擎

索引是在儲存引擎中實現的,因此,每種儲存引擎的索引都不一定完全相同,並且每種儲存引擎不一定支援所有的索引型別。根據儲存引擎定義每個表的最大索引數和最大索引長度。

所有的儲存引擎支援每個表至少16個索引,總索引長度至少為256位元組。

**mysql中兩種儲存型別btree、hash,跟表的儲存引擎相關。myisam和inoodb儲存引擎只支援btree索引。memory/heap儲存引擎可以支援hash和btree索引。**

3.mysql的索引分類

普通索引和唯一索引

普通索引允許在定義索引列中插入重複之和空值

唯一索引,索引列必須唯一,單允許有空值

單列索引和組合索引

單列索引即乙個索引只包含單個列,乙個表可以有多個單列索引
全文索引

型別為fulltext,在定義的列上支援值的全文查詢,允許插入重複值和空值,可以在char,varchar或text上建立,mysql中只有myisam儲存引擎支援全文索引
空間索引

針對空間資料型別建立的索引。mysql中空間資料型別有4種,geometry、point、linestring、polygon

建立空間索引的列必須生命為not null 儲存引擎為myisam的表中建立

建立索引

建立索引有三中方法,1建立表時就建立,2在已經存在的標上建立索引(這種有兩種語法),這裡只說常用的一種

使用alter table語句建立索引,語法:

alter table 表名 add[unique|fulltext|spatial] [index|key]

index_name[asc|desc]

ps: alter table 表名 add index 索引名稱(列名(長度))

使用show index 語句檢視指定表中建立的索引

mysql> show index from book \g

table:建立索引的表

non_unique:表示索引非唯一 1代表是非唯一 0代表唯一索引

key_name:索引的名稱

seq_in_index:表示欄位在索引種的位置,單列索引改值為1組合索引為每個字段索引定義中的順序。

column_name:表示定義索引的列欄位

sub_part:表示索引的長度

null:表示改欄位是否為空值

index_type:表示索引型別

我們查詢一條語句是否使用了索引可以使用

mysql>explain select * from 表名 where 列條件來進行檢視

explain解釋如下

select_type:指定所使用的查詢型別取值有******,primary,union,subquery

table:資料庫表名,如果為多表則按照先後順序排列

type:本資料表與其他資料表的關聯關係,等級越高效率越高system>const>sq_ref>ref>range>index>all

基本語句保持在ref或range最好

possible_keys:mysql在搜尋資料記錄是可選的索引

key:mysql實際使用的索引

key_len:索引按位元組計算的長度,key_len數值越小,表示效率越高

ref:關聯關係中另乙個資料表中的資料列名字

rows:mysql在執行這個查詢時預計會從這個資料表裡獨處的資料行的個數

extra:提供了與關聯操作有關的資訊

刪除索引

alter table 表名 drop index 索引名

4.這裡講下組合索引的命中規則,顧名思義組合索引就是乙個表中多個列組合在一起建立的索引。那麼它們是怎麼使用的呢?

組合索引是遵從「最左字首」,利用索引中最左邊的列集來匹配行,例如表中由id,name和age3個列構成的索引,按照id,name,age|id,name|id,age|id可以命中,如果按照name,age|age|name則不會使用索引。

具體測試**為下:

drop table test_index;

create table test_index (

id int not null,

name varchar(20),

age int,

*** int,

index zuhe(id,name,age)

);insert into test_index (id,name,age,***) values(1,'aaa',10,1);

insert into test_index (id,name,age,***) values(2,'bbb',20,2);

insert into test_index (id,name,age,***) values(3,'ccc',30,1);

insert into test_index (id,name,age,***) values(4,'ddd',40,2);

select * from test_index;

show create table test_index;

explain select * from test_index where id=1 and name='aaa' and age=10;

explain select * from test_index where id=1 and name='aaa' ;

explain select * from test_index where id=1 and age=10;

explain select * from test_index where id=1 ;

explain select * from test_index where name='aaa' and age=10;

explain select * from test_index where name='aaa';

explain select * from test_index where age=10;

這裡有個問題需要知道,這個表中一共有四個字段,三個字段形成了乙個組合索引,按照上面說的最左原則可以得出一致的結論,但是如果我把其中的***字段去掉後,執行上面任意的乙個查詢sql使用explain檢視結果會發現都使用了索引,並沒有遵循最左原則,這裡的原因是因為我們表中就剩下了三個欄位且三個字段組成了乙個組合索引因此,mysql在進行查詢時會主動使用定義的索引不會遵循最左原則。

這裡可以得出結論,如果我們查詢的列中沒有組合索引所包含的列那麼就算正確的使用組合索引,mysql也不會命中組合索引。

Mysql索引的使用 詳細講解

1.索引的簡介 索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可以提高資料庫中特定資料的查詢速度。2.索引的含義和特點 索引是乙個單獨的 儲存再磁碟上的資料庫結構,它們包含著對資料表裡所有記錄的引用指標。2.1索引的儲存引擎 索引是在儲存引擎中實現的,因此,每種儲存引擎的索引都不一定完...

MySQL索引的講解

mysql 的鎖按照範圍可以分為全域性鎖 表鎖 行鎖,其中行鎖是由資料庫引擎實現的,並不是所有的引擎都提供行鎖,myisam 就不支援行鎖,所以文章介紹行鎖會以innodb引擎為例來介紹行鎖。mysql 提供全域性鎖來對整個資料庫例項加鎖。語法 flush tables with read lock...

MySQL 索引講解

索引是幫助mysql高效獲取資料的排好序的資料結構。索引的資料結構 索引的節點儲存的是key 索引列欄位 value 行資料磁碟檔案的位址指標 從索引表中找的時候,都是從根節點去找。二叉樹的資料結構 採取二分查詢的思想,o logn 的複雜度就可以完成對資料的查詢任務,查詢所需的最大次數等同於二叉樹...