索引是在数据库中,对某一字段或者某几个组合字段按照一定的存储结构进行存储的功能,其能增加对索引字段的查找,mysql的innodb数据库引擎默认使用的是B+Tree存储结构,或者直接叫B树.
- B+Tree的存储结构的主要特点为:
- 数据都是存储在叶子节点中
- 从根节点到所有叶子节点的都是相同的
- 叶子节点存储的是其字段的指针
- 叶子节点存储着指向下一个节点的指针
由于B+Tree树的上述特点4,其可以从某个节点处开始,顺序读取出所有的值,因此其很适合查找一个范围内的数据.
对于联合索引,例如在person表中有(name, address)联合索引,由于在索引结构里面,每个节点的判断依据是对name+address组合的字符串进行查询,所以在查询时,需要使条件能满足name+address从左到右的部分(
最左前缀查找
),可以是部分,也可以是全部,以下语句都能使用到索引:
select * from person where name ='pan' and address='jiangsu';
select * from person where name ='pan' and sex='man';
select * from person where name ='pan' and address like 'j%';
select * from person where name like 'p%';
select * from person where name between 1 and 200;
- 以下语句将无法使用到索引:
select * from person where address='jiangsu';
select * from person where name like '%p%';
可匹配的类型
- 全值匹配值: 对索引字段都进行完全匹配
- 匹配最左前缀: 条件中按顺序包含索引的列前几项
- 匹配列前缀: 只匹配索引第一个字段的的开头部分,或前i个字段的完整匹配,第i个字段的开头部分
- 匹配范围值: 可以匹配索引第一个字段的范围,只适用于第一个字段
索引类型除了B-Tree结构外,还是hash存储,其是将关键字转成一串hash值,然后使用hash散列法存储,此方式优点为不管源数据多大,其索引值大小都是固定的,可以节省内存,查询数据快,但是随着数量增加,哈希值冲突的问题也会增加,这会增加数据库的查询时间,然后就是此方式只能使用
= is in
条件查询,不支持部分查询.
一般如果需求允许,能使用hash最好,因为其数据快
索引的优点
- 大大减少了服务器需要扫描的数据量
- 帮助服务器避免排序和临时表
- 将随机IO变成顺序IO
网友评论