什么是数据库索引?
索引的作用
數據庫的索引:為了使得查詢數據的效率變快。
數據庫索引有哪些
(1)聚集索引(主鍵索引):在數據庫里面,所有的行數都會按照主鍵索引進行排序。
(2)非聚集索引:給普通的字段加上索引。
(3)聯合索引(多屬性索引):給好幾個字段加上索引。
聯合索引的時候怎么走?
key 'idx_age_name_sex' ('age','name','sex')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 !=?'小張'
(1)對于A,遵循最左匹配,age在最左邊,所以A走索引。
(2)對于B,直接從name開始,不遵循最左匹配的原則,所以不走索引使得。
(3)對于C,雖然是從name開始,但是又索引最左邊的age,內部會轉成?
where age = '18' and?name = '小張' ?and sex = '男'?
這種格式的,所以還是走索引,遵循最左匹配的原則。
(4)對于D,因為age>20是范圍,范圍字段會結束索引對范圍后面索引字段的使用,所以只走了age這個索引。
(5)對于E,雖然遵循最左匹配但是是!=,不走索引。!=不走索引。
(6)對于F,只走age索引,不走name索引,原因和(5)一樣,!=不走索引。
什么樣的情況不走索引
如果在表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 = 18A走索引,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索引在磁盤上是怎么存儲的?
聚類索引和非據類索引的存儲是不同的。
有一張學生表:
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=小徐的數據了。
總結
- 上一篇: PropertyUtils
- 下一篇: linux cmake编译源码,linu