浅谈数据库索引
- 索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。
- 索引是针对表而建立的,它是由数据页面以外的索引页面组成的,每个索引页面中的行都会含有逻辑指针,以便加速检索物理数据。
- 索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。
简介
索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。反过来,如果记录的列存在大量相同的值,对该列创建索引就没有意义。
作用
- 快速取数据;
- 保证数据记录的唯一性;
- 实现表与表之间的参照完整性;
- 在使用ORDER by、group by子句进行数据检索时,利用索引可以减少排序和分组的时间。
优缺点
优点:
1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点:
1.索引需要占物理空间。
2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
分类
- 单值索引:一个索引只包含一列
- 唯一索引:索引列的值必须唯一,但允许有空值
- 复合索引:一个索引同时包括多个列
唯一索引
PS:
- 主键索引:一种特殊的唯一索引,创建主键时自动创建。
复合索引
最左前缀特性:
复合索引的结构是B+树,B+树是按照从左到右的顺序建立搜索树的。
扩展
索引及其扫描类型
type:
- ALL 全表扫描,没有优化。(最慢的方式)
- index 索引全扫描
- range 索引范围扫描,常用语<,<=,>=,between等操作
- ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中
- eq_ref 类似ref,区别于使用的是唯一索引,使用主键的关联查询
- const 当查询是对主键或者唯一键进行精确查询,系统会把匹配行中的其他列作为常数处理。
- null 不访问任何表或索引,直接返回结果
- system 表只有一条记录
性能排行:
system > const > eq_ref > ref > range > index > ALL
possible_keys
显示可能应用在这张表中的索引
key
真正使用的索引方式
什么情况索引不生效?
- 有or必全有索引;
- 复合索引未用左列字段;
- like以%开头;
- 需要类型转换;
- where中索引列有运算;
- where中索引列使用了函数;
- 如果mysql觉得全表扫描更快时(数据少);
扩展
数据库行锁、表锁机制
Q: 操作数据库时,什么时候进行行锁、表锁?
首先,我们思考一下,锁的作用————锁住数据,避免并发修改,导致脏数据产生。即保证并发修改时,不产生脏数据。
行锁:对数据表中特定一行或多行加锁。
表锁:对整张数据表加锁。
具体什么时候用行锁,表锁,实际上和索引有关。
评论