学习参考:114-索引概述_哔哩哔哩_bilibili
本文仅用于加强学习记忆,如果需要系统学习点击链接。
- 索引(index):
索引是在数据库表上字段添加的,为了提高查询效率存在的一种机制。
一张表的一个字段可以添加一个索引,当然,多个字段联合起来也可以添加索引。
索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制。
举个栗子,巨象一点,对于一本字典来说,查找某个汉字有两种方式:
- 第一种:一页一页找,直到找到为止,这种查找方式属于全字典扫描,效率比较低。
- 第二种:先通过目录(索引)去定位一个大概的范围位置,然后直接定位到这个位置,进行局部扫描,缩小扫描的范围,快速的查找。这种查找方式属于通过索引检索,效率比较高。
![]()
Mysql在查询方面主要就是两种方式:
第一种:全表扫描
第二种:根据索引检索 - 注意:
在实际中,汉语字典前面的目录是排序的,按照a,b,c,d,e,f...排序,只有排序了才会有区间查找这个说法(缩小扫描范围也就是扫描某个区间罢了)
在mysql数据库中索引也是需要排序的,并且这个排序和TreeSet数据结构相同。TreeSet(TreeMap)底层是一个自平衡二叉树,在Mysql中索引是一个B-Tree数据结构。
遵循左小右大原则存放,采用中序遍历方式遍历取数据。
- 索引的实现原理:
在任何数据库当中主键上都会自动添加索引对象;另外在mysql中,一个字段上有unique约束的话,也会自动创建索引对象。
在任何数据库当中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号。
在mysql当中,索引是一个单独的对象,不同的存储引擎以不同的形式存在,在MyISAM存储引擎中,索引存储在一个.MYI文件中。在InnoDB存储引擎中索引存储在一个逻辑名称叫做tablespace的当中。在MEMORY存储引擎当中索引被存储在内存当中。不管索引被存储在哪里,索引在Mysql当中都是一个树的形式存在。(自平衡二叉树:B-Tree) - 在Mysql当中,主键上,以及unique字段上都会自动添加索引
给字段添加索引的情况:
- 条件1:数据量庞大(到底多庞大算庞大? 这个需要测试,取决于硬件环境)
- 条件2: 该字段经常出现在where后面,以条件的形式存在,也就是说这个字段总是被扫描
- 条件3: 该字段很少DML操作。(因为DML后,该字段需要重新排序
建议不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低系统性能。
建议通过主键查询、通过unique约束字段查询,效率是比较高的。
- 索引的创建与删除:
给emp表的enamel字段添加索引,起名 emp_ename_index
![]()
删除相应的索引:
将emp表上的emp_ename_index索引对象删除。![]()
- 查看一个sql语句是否使用索引进行检索
使用explain关键字
![]()
- 索引也存在失效的情况:
eg: select * from emp where ename like '%T';
这种情况就算你的ename中添加了索引也不会走索引
原因是模糊匹配中以"%"开头了
尽量避免模糊查询以”%“开头
这是一种优化和策略。
还有条件查询的时候使用or也会出现索引失效的情况。 - 索引是各种数据库用于优化的重要手段。优化时优先考虑的因素就是索引
索引在数据库当中分了很多类。
单一索引
复合索引
主键索引
唯一性索引
......
注意:唯一性比较弱的字段上添加索引用处不大,unique较弱,可能会存在大量的重复数据,这个时候索引不起什么太大作用。越唯一效率越高。



