1 概述
索引帮助Mysql高效获取获取数据的数据结构(排好序的快速查找 数据结构)。
我们平常所说的索引,如果没有特别指明,都是B树(多路搜索树,并不一定是二叉树)结构组织的索引,其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认使用B+树索引,统称索引。除了B+树索引之外还有哈希索引(hash、index)等。
索引本生也很大,往往依文件的形式存储在磁盘上。
2 优缺点
优点
提高了数据检索的效率,降低了数据IO的成本。(如:加速表和表之间的连接)
通过索引对数据进行排序,降低了数据排序的成本,降低了CPU的消耗。如:在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。)
保证数据的唯一性。(如:创建唯一性索引,保证数据库表中每一行数据的唯一性)
缺点
增加了存储空间;降低了插入修改表数据的效率。(插入和修改的时候索引的指向也要随之改变)
3 索引相关sql操作
1
-- 添加索引
2
ALTER TABLE `sales_order` ADD INDEX index_name (`column`);
3
-- 查询索引
4
SHOW INDEX FROM acl_user;
5
-- 删除索引
6
DROP index index_name ON acl_user;
7
-- 其它相关操作 https://blog.csdn.net/wocjj/article/details/7415223
4 索引原理分析
4.1 索引数据结构
数据库除数据本身之外,还维护着一个满足特定查找算法的数据结构,这种数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引。下图展示了一种可能的索引方式。
正在上传…重新上传取消转存失败重新上传取消二叉查找树
左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在O(log2n)的复杂度内获取到相应数据。
下图描述的是B树索引的数据结构
4.2 索引分类
4.2.1 数据结构划分
B树索引(O(log(n))):关于B树索引,可以参考 MySQL索引背后的数据结构及算法原理
Hash索引:
a、仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询
b、其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引
c、只有Memory存储引擎显示支持hash索引
FULLTEXT索引:现在MyISAM和InnoDB引擎都支持了
R-Tree索引:用于对GIS数据类型创建SPATIAL索引)
4.2.2 逻辑角度划分(Mysql)
普通索引(Normal):最基本的索引没有唯一性之类的限制。
唯一索引(Unique):既索引列值必须唯一,但允许有空值。(主键索引是一种特殊的唯一索引,不允许有空值)
全文索引:全文索引只可以在VARCHAR或者TEXT类型的列上创建。
组合索引:(多列索引):既一个索引包含多列。
备注:索引匹配依照最左原则。where后的多条件顺序要和组合索引的顺序保持排序一致。
5 索引的使用场景
需要建索引场景
1、主键自动建立唯一索引
2、频繁作为查询条件的字段应该创建索引。
3、查询中与其它表关联的字段,外键关系的字段,建立索引。
4、频繁更新的字段不适合创建索引。
5、在高并发下倾向于组合索引。
6、查询中排序,通过索引去访问大大提高排序速度。
7、查询中统计或分组的字段。
不需要创建索引场景
1、表记录太少
2、经常增删改的表。Mysql不仅要保存数据还要保存索引文件。
3、数据重复且分布平均的字段(如表示状态的字段)。注:如果表中某个字段数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。