MySQL索引的概念
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构,通俗来讲索引就好比书本的目录,加快数据库的查询速度。
举个简单的例子,见下图:
注意:此例子的中索引结构与数据库中的索引结构差距很大
user表有3个字段(id、name、age),存储8条记录,当我们查找age为20的记录时,sql语句 select * from user where age=20;
1 在没有索引情况下需要依次遍历表里的记录,第6次时找到age=20的记录;
2 如果我们在age列添加索引,只需3次,就可以找到age=20的记录。
正如官方所说:索引是一个数据结构;
通过语句show index from tablename查看索引
可以根据Index_type看出该索引由BTREE数据结构实现;除了BTREE,还有HASH、FULLTEXT、RTREE;
索引的作用
- 提高查询效率
- 消除数据分组、排序
- 避免“回表”查询(索引覆盖)
- 优化聚合查询
- 用于多表JOIN关联查询
- 利用唯一性约束,保证数据唯一性
- InnDB行锁实现
索引的副作用
- 增加I/O成本
- 增加磁盘空间
- 不合适的索引或索引过多,会降低增删改的效率
索引的分类
1 存储结构
- BTREE:InnoDB & MyISAM
- HASH:HEAP,NDB,InnoDB AHI
- Fractal Tree:TokuDB
- RTREE
- FULLTEXT
2 数据的存储方式
- 聚集索引:聚簇索引的顺序就是数据的物理存储顺序,索引与数据存放在同一个文件中。
- 非聚集索引:非聚簇索引的顺序与数据的物理存储顺序不同,索引与数据存放在不同的文件。
3 应用层次
- 单列:主键索引、唯一索引、普通索引
- 多列:复合索引