作者:刘通亮
索引是对数据库表中的一列或多列的值进行排序的一种结构,使用索引可以提高数据库中特定数据的查询速度。
原理:索引是经过某种算法优化的一种数据结构,可以快速查找。在mysql中使用索引可以快速找到被查询的数据,避免全表扫描,从而确定这一行记录的位置。
优点:
缺点:
普通索引:mysql中的基本索引类型,允许在定义索引的列中插入重复值和空值。
唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。主键索引是一种特殊的唯一索引,不允许有空值。
单列索引:一个索引只包含单个列,一个表可以有多个单列索引。
组合索引:指在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的最左边的字段时,索引才会被使用。遵循最左前缀集合。
全文索引类型为FULLTEXT,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。全文索引可以在CHAR、VARCHAR或者TEXT类型的列上创建。Mysql中只有MyISAM存储引擎支持全文索引(Mysql5.6以后InnoDB存储引擎也支持全文索引,笔者在Mysql5.72中在InnoDB存储引擎的表中建立过,但是实际应用没有做研究)。
空间索引是对空间数据类型的字段建立的索引,Mysql中的空间数据类型有4种,分别是:GEOMETRY(几何)、POINT(点)、LINESTRING(线段)、POLYGON(多边形)。Mysql中使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类似的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MyISAM的表中创建。
create table table_name [col_name data_type]
[unique|fulltext|spatial] [index|key] [index_name] (col_name [length]) [asc | desc]
示例(普通索引和唯一索引):
创建user表,有id,name,phone,age四个字段,在name字段上建立普通索引。
查看索引:
有三种方式:
上图中箭头指的那一行key和index是等价的,都表示索引。
2. desc user
PRI表示主键(非空的唯一索引)UNI表示唯一索引MUL表示普通索引(列上可以有重复值)
3. show index from user(重要)
上图中描述了user表中所有的索引的详细信息。具体的含义可以自己去查,这里不在废话。
创建user表,有id,name,phone,age四个字段,在phone字段上建立唯一索引。
第一种方式
第二种方式
这种方式唯一索引的名字会自动生成,默认为字段名
注:读者也可以尝试用show create table user或者desc user去查看下。
创建user表,有id,name,phone,age四个字段,在phone、name、age字段上建立组合索引。
查看索引
建立唯一组合索引
查看索引
alter table table_name add [unique|fulltext|spatial]
[index|key] [index_name] (col_name[length],...) [asc|desc]
示例:普通组合索引
先创建user表,有id,name,phone,age四个字段
在phone、name、age字段上建立组合索引。
查看索引
create [unique|fulltext|spatial] index index_name
on table_name (col_name[length],...) [asc|desc]
示例:普通组合索引
先创建user表,有id,name,phone,age四个字段
在phone、name、age字段上建立组合索引。
查看索引
alter table table_name drop index index_name
2. 使用drop index语句删除索引
drop index index_name on table_name
示例: