什麼是數據庫索引?


大家平時在開發過程中都避免不了使用數據庫索引,那麼你瞭解數據庫索引麼,接下來呢,我就簡單講一下什麼是數據庫索引。

一、數據索引是幹什麼用的呢?

數據庫索引其實就是爲了使查詢數據效率快。

二、數據庫索引有哪些呢?

  1. 聚集索引(主鍵索引):在數據庫裏面,所有行數都會按照主鍵索引進行排序。
  2. 非聚集索引:就是給普通字段加上索引。
  3. 聯合索引:就是好幾個字段組成的索引,稱爲聯合索引。
key 'idx_age_name_sex' ('age','name','sex')

聯合索引遵從最左前綴原則,什麼意思呢,就比如說一張學生表裏面的聯合索引如上面所示,那麼下面A,B,C,D,E,F哪個會走索引呢?

A:select * from student where age = 16 and name = '小張'
B:select * from student where name = '小張' and sex = '男'
C:select * from student where name = '小張' and sex = '男' and age = 18
D:select * from student where age > 20 and name = '小張'
E:select * from student where age != 15 and name = '小張'
F:select * from student where age = 15 and name != '小張'

A遵從最左匹配原則,age是在最左邊,所以A走索引;

B直接從name開始,沒有遵從最左匹配原則,所以不走索引;

C雖然從name開始,但是有索引最左邊的age,mysql內部會自動轉成where age = ‘18’ and name = ‘小張’ and sex = ‘男’ 這種,所以還是遵從最左匹配原則;

D這個是因爲age>20是範圍,範圍字段會結束索引對範圍後面索引字段的使用,所以只有走了age這個索引;

E這個雖然遵循最左匹配原則,但是不走索引,因爲!= 不走索引;

F這個只走age索引,不走name索引,原因如上;

三、有哪些列子不走索引呢?

表student中兩個字段age,name加了索引

key 'idx_age' ('age'),
key 'idx_name' ('name')
  1. Like這種就是%在前面的不走索引,在後面的走索引
A:select * from student where 'name' like '王%'
B:select * from student where 'name' like '%小'

A走索引,B不走索引

  1. 用索引列進行計算的,不走索引
A:select * from student where age = 10+8
B:select * from student where age + 8 = 18

A走索引,B不走索引

  1. 對索引列用函數了,不走索引
A:select * from student where  concat('name','哈') ='王哈哈';
B:select * from student where name = concat('王哈','哈');

A不走索引,B走索引

  1. 索引列用了!= 不走索引,如下:
select * from student where age != 18

四、爲什麼索引用B+樹?

這個可以參考什麼是B+樹

五、索引在磁盤上的存儲?

聚集索引和非聚集索引存儲的不相同,那麼來說下都是怎麼存儲的?

有一張學生表

create table `student` (
`id` int(11) not null auto_increment comment '主鍵id',
`name` varchar(50) not null default '' comment '學生姓名',
`age` int(11) not null default 0 comment '學生年齡',
primary key (`id`),
key `idx_age` (`age`),
key `idx_name` (`name`)
) ENGINE=InnoDB default charset=utf8 comment ='學生信息';

表中內容如下
在這裏插入圖片描述

id 爲主鍵索引,name和age爲非聚集索引

  1. 聚集索引在磁盤中的存儲

在這裏插入圖片描述

聚集索引葉子結點存儲是表裏面的所有行數據;

每個數據頁在不同的磁盤上面;

如果要查找id=5的數據,那麼先把磁盤0讀入內存,然後用二分法查找id=5的數在3和6之間,然後通過指針p1查找到磁盤2的地址,然後將磁盤2讀入內存中,用二分查找方式查找到id=5的數據。

  1. 非聚集索引在磁盤中的存儲

在這裏插入圖片描述

葉子結點存儲的是聚集索引鍵,而不存儲表裏面所有的行數據,所以在查找的時候,只能查找到聚集索引鍵,再通過聚集索引去表裏面查找到數據。

如果要查找到name = 小徐,首先將磁盤0加載到內存中,然後用二分查找的方法查到在指針p1所指的地址上,然後通過指針p1所指的地址可知道在磁盤2上面,然後通過二分查找法得知小徐id=4;

然後在根據id=4將磁盤0加載到內存中,然後通過二分查找的方法查到在指針p1所指的地址上,然後通過指針p1所指的地址可知道在磁盤2上面,然後通過id=4查找出鄭正行數據,就查找出name=小徐的數據了。

發佈了77 篇原創文章 · 獲贊 14 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章