大家平時在開發過程中都避免不了使用資料庫索引,那麼你了解資料庫索引麼,接下來呢,我就簡單講一下什麼是資料庫索引。
一、資料索引是幹什麼用的呢?
資料庫索引其實就是為了使查詢資料效率快。
二、資料庫索引有哪些呢?
聚集索引(主鍵索引):在資料庫裡面,所有行數都會按照主鍵索引進行排序。
非聚集索引:就是給普通字段加上索引。
聯合索引:就是好幾個字段組成的索引,稱為聯合索引。
key 'idx_age_name_***' ('age','name','***')
聯合索引遵從最左字首原則,什麼意思呢,就比如說一張學生表裡面的聯合索引如上面所示,那麼下面a,b,c,d,e,f哪個會走索引呢?
a:select * from student where age = 16 and name = '小張'
b:select * from student where name = '小張' and *** = '男'
c:select * from student where name = '小張' and *** = '男' 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 *** = '男' 這種,所以還是遵從最左匹配原則;
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不走索引
2.用索引列進行計算的,不走索引
a:select * from student where age = 10+8
b:select * from student where age + 8 = 18
a走索引,b不走索引
3.對索引列用函式了,不走索引
a:select * from student where concat('name','哈') ='王哈哈';
b:select * from student where name = concat('王哈','哈');
a不走索引,b走索引
4. 索引列用了!= 不走索引,如下:
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的資料。
2.非聚集索引在磁碟中的儲存
葉子結點儲存的是聚集索引鍵,而不儲存表裡面所有的行資料,所以在查詢的時候,只能查詢到聚集索引鍵,再通過聚集索引去表裡面查詢到資料。
如果要查詢到name = 小徐,首先將磁碟0載入到記憶體中,然後用二分查詢的方法查到在指標p1所指的位址上,然後通過指標p1所指的位址可知道在磁碟2上面,然後通過二分查詢法得知小徐id=4;
然後在根據id=4將磁碟0載入到記憶體中,然後通過二分查詢的方法查到在指標p1所指的位址上,然後通過指標p1所指的位址可知道在磁碟2上面,然後通過id=4查詢出鄭正行資料,就查詢出name=小徐的資料了。
MySQL鍵值 什麼是索引
什麼是索引 就是對資料表中的若干字段進行排序的方法,類似於對一本書做目錄,有了目 錄就可以快速定位資料的具體位置。索引的優點 通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性 可以加快資料的檢索速度 索引的缺點 當對表中的資料進行增加 刪除和修改的時候,索引也要動態的維護,會降低資料庫 的寫...
什麼是索引?
mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可以有多個單列索引,...
什麼是索引?
mysql 資料庫舉例吧 一 什麼是索引?索引用來快速地尋找那些具有特定值的記錄,所有mysql索引都以b 樹的形式儲存。如果沒有索引,執行查詢時mysql必須從第乙個記錄開始掃瞄整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜尋條件的列上已經建立了索...