索引类似于一本书的目录,可以根据页码更快的查找到内容。索引可以加快访问数据库的速度
(1).普通索引:最基本的索引,没有任何限制;
(2).唯一索引:索引列的值必须唯一,允许有空值。如果是组合索引,则列值的组合必须唯一;
(3).主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值;
(4).组合索引:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合;
(5).全文索引:主要用来查找文本中的关键字,而不是直接与索引中的值相比较,mysql中MyISAM支持全文索引而InnoDB不支持;
MySQL存储引擎InnoDB,MyISAM和Memory分别支持的索引类型
InnoDB | MyISAM | Memory | |
B树 | Yes | Yes | Yes |
Hash | No | No | Yes |
FullText | Yes | Yes | No |
B树:基于平衡二叉树,默认使用的索引类型
B- 叶子节点无水平指针
B+ 叶子节点有水平指针,可以方便范围查询
B* 枝节点有水平指针,mysql当前默认
R树:R树是B树在高维空间的扩展,是一棵平衡树
Hash:基于哈希表实现,只有精确匹配索引所有列的查询才有效。
FullText:基于相似度的查询,而不是精确数值比较。
GIS:以较小的数据量管理大量数据的查询,从而提高空间查询的效率和空间定位的准确性。
MySQL 会自动选择主键作为聚集索引列,没有主键会选择唯一键,如果都没有会生成隐藏的.
MySQL进行存储数据时,会按照聚集索引列值的顺序,有序存储数据行
聚集索引直接将原表数据页,作为叶子节点,然后提取聚集索引列向上生成枝和根
提取索引列的所有值,进行排序
将排好序的值,均匀的存放在叶子节点,进一步生成枝节点和根节点
在叶子节点中的值,都会对应存储主键ID
辅助索引细分还可以分为:唯一索引,单列辅助索引,联合索引
表中任何一个列都可以创建辅助索引,在你有需要的时候,只要名字不同即可
在一张表中,聚集索引只能有一个,一般是主键.
辅助索引,叶子节点只存储索引列的有序值+聚集索引列值.
聚集索引,叶子节点存储的时有序的整行数据.
MySQL 的表数据存储是聚集索引组织表,辅助索引查询表。
注:mysql的查询过程就是通过辅助索引找到主键索引的id号,再通过主键索引查数据行
查询索引
desc city;
PRI ==> 主键索引
MUL ==> 辅助索引
UNI ==> 唯一索引
mysql> show index from city\G
创建索引
单列的辅助索引:
mysql> alter table city add index idx_name(name);
多列的联合索引:
mysql> alter table city add index idx_c_p(countrycode,population);
唯一索引:
mysql> alter table city add unique index uidx_dis(district);
mysql> select count(district) from city;
mysql> select count(distinct district) from city;
前缀索引
mysql> alter table city add index idx_dis(district(5));
删除索引
mysql> alter table city drop index idx_name;