一、索引的概念:
索引是⼀种特殊的⽂件(InnoDB数据表上的索引是 表空间的⼀个组成部分),它们包含着对数据表⾥所有记录的引⽤指针。更通俗的说,数据库索引好⽐是⼀本书前⾯的⽬录,能加快数据库的查询速度
二、索引的作⽤:
索引的⽬的在于提⾼查询效率,使原始的随机全表扫描变成快速顺序锁定数据
三、常⽤索引的分类:
普通索引:这是最基本的索引,它没有任何限制
唯⼀索引:引列的值必须唯⼀,但允许有空值(注意和主键不同)
组合索引:多个数据列组成的索引,遵守最左匹配原则
四、索引⾼性能保证:
1.把查询过程中的随机事件变成顺序事件
2.数据保存在磁盘上,⽽为了提⾼性能,每次⼜可以把部分数据读入内存来计算,访问磁盘的成本⼤概是访问内存的⼗万倍左右
3.磁盘IO与预读:
考虑到磁盘IO是⾮常⾼昂的操作,计算机操作系统做了⼀些优化,当⼀次IO时,不光把当前磁盘地址的数据,⽽是把相邻的数据也都读取到内存缓冲区内,因为局部预读性原理告诉我们,当计算机访问⼀个地址的数据的时候,与其相邻的数据也会很快被访问到。每⼀次IO读取的数据我们称之为⼀⻚(page)。具体⼀⻚有多⼤数据跟操作系统有关,⼀般为4k或8k
五、为什么磁盘读取数据很慢:
与主存不同,磁盘I/O存在机械运动耗费,因此磁盘I/O的时间消耗是巨⼤的磁盘读取时间 = 寻道时间 + 旋转时间 + 传输时间当需要从磁盘读取数据时,系统会将数据逻辑地址传给磁盘,磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址,即确定要读的数据在哪个磁道,哪个扇区。为了读取这个扇区的数据,需要将磁头放到这个扇区上⽅,为了实现这⼀点,磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间,然后磁盘旋转将⽬标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间
六、索引注意事项
一、不适用:
1.不适合键值少的列(重复数据较多辨识度低)
2.索引无法存储null值
二、失效:
1.条件中有or 即使条件带索引也会失效,(使用or且让索引生效:or条件中所有的列都加上索引)
2.组合索引:单条件查询只会命中多列中的第一条索引(最左匹配原则)
3.like查询以%开头
3.类型强转:如varchar用long传参查询
4.hash索引不支持范围检索
