###第三部分:MySQL索引介绍
一、MySQL索引
建立索引的目的:
为表Table建立“目录”,防止全表扫描(Full Scan)
索引的存储形式是由存储引擎决定的
降低了写入数据的效率,太多的索引增加了查询优化器的选择时间,不合理的使用索引会大幅占用磁盘空间
不会用到索引的场景:
索引选择性差
<> /not in无法使用索引,is null会使用索引,is not null 不会使用索引
where子句跳过索引左侧列,直接查询右侧索引字段
对索引列进行计算或者使用函数
二、索引的分类:
按照存储结构分类:BTree索引(B-Tree、B+Tree)、Hash索引、full-index全文索引、R-Tree索引
应用层次划分:普通缩影、唯一索引、符合索引
根据数据的物理顺序和键值逻辑顺序关系:聚集索引、非聚集索引
B+Tree索引:适合范围查找,采用的是树形链表结构保存“目录”
Hash索引:精准匹配
B+Tree索引:
聚集索引,适合范围查找
创建和删除索引:create index idx_uid(uid) on user; drop index idx_uid on user;
B+tree索引支持精确索引、范围查询、where条件后的类型最好和数据库一致;
对于字符串like查询,B-tree支持前缀查询,如:LIKE ‘xxxx%’,后缀查询和模糊匹配B+tree都不支持,如:LIKE ‘%xxxx’,LIKE ‘%xxxx%’
B+tree复合索引:
create index idx_uid(uid,mobile) on user;
复合索引查询条件必须包含左侧列:select * from user where uid = 1
直接树勇右侧列将无法使用索引:select * from user where mobile = 'xxx'
使用<>和not in会导致不能使用索引:select * from user where uid <> 1
Hash索引:
基于hash表实现,精确匹配索引所在列才有效,不支持范围查询和模糊查询和排序
Hash索引为每条数据生成一个HashCode,只包含和Hash 值和行指针