索引的概述:MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样可以在这些数据结构上实现高级查找算法,这就是索引,如下图:
左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找快速获取到相应数据。
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。索引是数据库中用来提高性能的最常用的。
索引的优势劣势:
(1)类似于书籍的目录索引,提高数据检索的效率,降低数据库的IO成本。
(2)通过索引列对数据进行排序,降低数据排序的成本,降低cpu的消耗
劣势:
(1)实际上索引也是一张表,该表中保存了主键索引字段,并指向表的记录,所以索引列也是要占空间的。
(2)虽然索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行insert,update,delete,因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件,每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。
索引结构:
索引是在MySQL的存储引擎层中实现的,而不是在服务器层实现的,所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型的。
MySQL目前提供了一下四种索引:
BTREE索引:最常见的索引类型,大部分索引都支持B树索引
HASH索引 :只有Menory引擎支持,使用场景简单。
R-tree :空间索引时MyISAM引擎的一个特殊索引类型,主要用于地理空间数据,通常受用较少。
Full-text : (全文索引)全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引。
索引 ==InnoDB引擎== ==MyISAM引擎== Memory引擎 BTREE索引 支持 支持 支持 HASH 索引 不支持 不支持 支持 R-tree 索引 不支持 支持 不支持 Full-text 5.6版本之后支持 支持 不支持
索引分类:
(1)单值索引:即一个索引只包含单个列,一个表可以有多个单列索引
(2)唯一索引:索引列的值必须唯一,但允许有空值
(3)复合索引:即一个索引包含多个列