- 数据是存储在磁盘上的,操作系统读取磁盘的最小单位是块,如果没有索引,会加载所有的数据到内存,依次进行检索,加载的总数据会很多,磁盘IO多。
- 如果有了索引,会以某个列为key创建索引,MySQL采用B+树结构存储,一方面加载的数据只有某个列和主键ID,另一方便采用了多叉平衡树,定位到指定某个列的值会很快,根据关联的ID可以快速定位到对应行的数据所以检索的速度会很快,因为加载的总数据很少,磁盘IO少。
- 可见,索引可以大大减少检索数据的范围、减少磁盘IO,使查询速度很快,因为磁盘IO是很慢的,是由它的硬件结构决定的。
优点
- 索引能够提高数据检索的效率,降低数据库的IO成本。
- 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性,创建唯一索引。
- 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
- 加速两个表之间的连接,一般是在外键上创建索引。
缺点
- 需要占用物理空间,建立的索引越多需要的空间越大
- 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
- 会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长
何时应该创建索引
- 主键,自动建立唯一索引
- 频繁作为查询的条件的字段
- 查询中与其他表关联的字段存在外键关系
- 查询中排序的字段,排序字段若通过索引去访问将大大提高排序的速度
- 查询中统计或者分组字段
避免创建索引的情况
- 数据唯一性差的字段不要使用索引(比如性别,只有两种可能数据。意味着索引的二叉树级别少,多是平级。这样的二叉树查找无异于全表扫描。)
- 频繁更新的字段不要使用索引(比如登录次数,频繁变化导致索引也频繁变化,增大数据库工作量,降低效率。)
- 字段不在where语句出现时不要添加索引(只有在where语句出现,mysql才会去使用索引)
- 数据量少的表不要使用索引(数据量小时,基本改善不大)