索引分类
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引一般可以分为四类
-
单列索引:单列索引指的是只包含一列的索引,又可分为三种:
- 普通索引:普通索引是最基本的索引类型,没有什么限制,且允许空值和重复值。
- 唯一索引:唯一索引列中的值必须是唯一的,允许存在一个空值。多个空值仍然会视为重复
- 主键索引:主键索引是特殊的唯一索引,不允许存在空值。
-
组合索引:组合索引也就是多列索引,由多列组合创建的索引,使用的时候遵循最左前缀原则。
-
全文索引:5.7 以前全文索引只有 MyISAM 引擎支持,且只能在 CHAR,VARCHAR,TEXT 类型字段上使用全文索引,主要用于做文章的关键字搜索的。
-
空间索引:空间索引是对空间数据类型的字段建立的索引。
主键索引
主键索引又被称为聚簇索引和聚集索引。
一张表中只能有一个主键索引,如果表中没有主键,就会选择第一个唯一字段作为主键索引。
如果没有主键和唯一字段,InnoDB存在一个隐藏列,rowID,会使用rowID字段作为索引。
在一张表中,主键索引树中,叶子节点存放的是完整的行数据。
唯一索引(二级索引)
一张表中可以存在多个。唯一索引是一个二级索引,二级索引树的叶子节点存储的是主键值。
唯一索引在成功创建后,该列便不能存在重复数据,如果有数据为空,也不能存在两个及以上的空数据。
在该列插入重复数据时候,便会报错;同时如果给已经存在的数据库创建唯一索引,如果该列已经存在重复数据,也会报错,需要删除重复数据后才能继续创建。
抛出的错误码是:1602。
唯一索引的创建(SQL):
CREATE UNIQUE INDEX username_unique on users (username(50)); -- 创建唯一索引
ALTER TABLE users ADD UNIQUE INDEX username_unique (username(50)); -- 创建唯一索引
CREATE TABLE users(
id int(11) NOT NULL,
username VARCHAR(225),
UNIQUE INDEX [username_index] (usename(50)) -- 在创建表的同时创建唯一索引
);
username(50) 表示只取该列的前五十个字符进行唯一判断,可以避免某些数据长度比较大的情况。这是一个前缀索引的概念。
普通索引(二级索引)
针对普通索引创建的索引,一张表中可以存在多个
联合索引
联合索引是多个字段组成的索引,需要遵循最左匹配原则。
最左匹配原则
建立的联合索引,需要从左到右依次匹配,如果中间没有字段,那么后续索引会直接失效。