目录
1.1概念
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引, 并指定索引的类型,各类索引有各自的数据结构实现。
1.2作用
数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
索引所起的作用类似书籍目录,可用于快速定位、检索数据。
索引对于提高数据库的性能有很大的帮助。
1.3使用场景
使用索引时,需考虑以下场景:
数据量较大,且经常对这些列进行条件查询。
该数据库表的插入操作,及对这些列的修改操作频率较低。
索引会占用额外的磁盘空间。
1.4使用
创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建 对应列的索引。
查看索引
语法:
show index from 表名;
show index from student;
创建索引:
语法:
create index 索引名 on 表名(字段名);
create index idx_classes_name on classes(name);
删除索引:
语法:
drop index 索引名 on 表名;
drop index idx_classes_name on classes;
一张表里至少有一个索引
如果一张表里没有主键,MySQL会为每一行生成一个唯一的字段,并用这个字段当作索引
索引一般创建在频繁查询的列上,且这个列中的值重复较少
1.5索引使用的数据结构
1.HASH 查询的时间复杂度为O(1) (不是)
HASH并不支持范围查找
2.二叉搜索树(不是)
时间复杂度O(n)
3.红黑树(不是)
时间复杂度log(n)
树的每一层对应查询过程中的一次磁盘IO
4.B树(不是)
B树可以降低树高,但MySQL依然没有使用
5.B+树(是的)
对B树做了进一步的优化
使用B+树的原因
1.叶子节点是相互连接的,MySQL中使用的B+树是一个双向的循环链表。
2.叶子节点包含了树中所有节点的真实数据,非叶子节点中包含的是主键(id)和叶子节点的引用。
3.在一定的数据范围内,不论查找的数据是什么,时间效率基本相同。
4.最重要的是,叶子节点中的数据是有序的,所以支持范围查找。
5.N叉搜索树,有效的降低了树的高度,从而减少了磁盘IO次数。
一个索引中包含多个字段就叫组合索引。
create index index_student_sn_name on student(sn,name);
show index from student;
索引本身占用磁盘空间。
在查询的时候一定要在where条件中按索引的顺序写过滤条件。
select * from student where sn='10006'and name='王源';
使用索引的最左原则
如果索引中包含要查询的所有列,那么直接从索引中返回结果,这个现象叫做索引覆盖。
select sn,name from student where sn='10006'and name='王源';
主键索引中包含当前数据行的所有列的值
当查询列表为*或索引不能完全满足查询结果,那么使用id到主键索引中查询完整的结果,称为回表查询。
使用explain+selec语句可以查看该select语句是否使用索引
explain select sn,name from student where sn='10006'and name='王源';
1.6索引失效
1.最左原则
2.判断不等:每个都要判断
3.类型转换:与原类型不同
4.模糊匹配:like'%xxx'
5.索引列运算:修改了原来的值
6.is null 或 is not null 全表扫描