建立索引的语句:
CREATE [UNIQUE|NONCLUSTERED|CLUSTERED] INDEX INDEX_NAME ON TABLE_NAME(COL_NAME) [where ......]
说明:
UNIQUE:唯一索引,相应列上不可插入重复值
NONCLUSTERED:非聚集索引
CLUSTERED:聚集索引
INDEX_NAME:索引名
TABLE_NAME:表名
COL_NAME:建立索引的字段名。可以为多列,称为复合索引,查询时字段顺序需要和建立索引的顺序一致
[where......]:筛选索引的条件,只对符合条件的记录建立索引
一、索引概念
我的理解,索引就像是目录一样,而实际的数据表的值就是具体的内容。使用索引可以提高查询速度。
1、 聚集索引:
一个表只能有一个。索引的顺序与数据表的排列顺序一致。
聚集索引的约束是唯一性,如果未使用 UNIQUE 属性创建聚集索引,innodB数据库引擎将向表自动添加一个四字节 uniqueifier 列。必要时,数据库引擎 将向行自动添加一个 uniqueifier 值,使每个键唯一。此列和列值供内部使用,用户不能查看或访问。
在mysql中,我们创建的主键会自动建立聚集索引,数据是按照我们的主键顺序进行排列。所以在根据主键进行查询时会非常快。
2、非聚集索引:
一个表可以有多个。索引的顺序与数据表的排列顺序不一致。
覆盖索引(非聚集索引的一种形式):索引包含(亦称覆盖)所有需要查询的字段的值,我们称这种索引为覆盖索引。索引的叶子节点包含了要查询的数据,无需回表查询。
二、使用索引的条件
动作描述 | 使用聚集索引 | 使用非聚集索引 |
列经常被分组排序 | 应 | 应 |
返回某范围内的数据 | 应 | 不应 |
一个或极少不同值 | 不应 | 不应 |
小数目的不同值 | 应 | 不应 |
大数目的不同值 | 不应 | 应 |
频繁更新的列 | 不应 | 应 |
外键列 | 应 | 应 |
主键列 | 应 | 应 |
频繁修改索引列 | 不应 | 应 |
接下来会再学习索引的底层实现原理。