四、索引操作
4.1 创建主键索引
方式一
创建表时,直接在对应的字段名后指定primary key
方式二
在创建表的最后,指定某列或某几列为主键索引
方式三
创建表后,使用alter指令给指定字段添加主键索引
4.2 创建唯一索引
方式一
在创建表时,直接在对应的字段名后指定unique
方式二
在创建表的最后,指定某列或某几列为唯一索引
方式三
创建表后,使用alter命令给指定字段添加唯一索引
4.3 创建普通索引
方式一
在创建表的最后,指定某列或某几列为普通索引
方式二
创建表后,使用alter命令给指定字段添加普通索引
方式三
创建表后,使用create命令给指定字段创建普通索引,并指定索引名
4.4 创建全文索引
全文索引比较常见的案例就是对文章中的词进行搜索,如下面创建一个文章表,表中包含文章的id、文章名称、文章内容,并在创建表的最后通过fulltext给title和body列创建全文索引
向表中插入一些测试数据
若要查询哪些文章中包含database关键字,可通过模糊匹配进行查找
但这种查找方式并没有用到全文索引,在SQL语句前加上explain,看到key对应的值为NULL,表示这条SQL在执行过程中没有用到任何索引
若要通过全文索引查询,需使用match against进行搜索。这条SQL语句前面加上explain,可以看到key对应的值为title,表示这条SQL在执行过程中用到了索引名为title的索引
注意:
MyISAM存储引擎支持全文索引,而InnoDB存储引擎是在5.6以后才开始支持全文索引
同时使用title和body建立全文索引时,相当于建立了一个复合索引,默认会选择fulltext中的第一个列名作为这个复合索引的索引名,所以这里explain中key对应的索引名为title
由于是title和body共同建立的全文索引,所以若文章中没有出现关键字,但文章名称中出现了关键字则也会被筛选出来(当前示例没有体现出来)
4.5 查询索引
方式一
使用show keys from 表名查询,比如查询articles表中的索引信息
Table:表示创建索引的表的名称
Non_unique:表示该索引是否是唯一索引,若是则为0,若不是则为1
Key_name:表示索引的名称
Seq_in_index:表示该列在索引中的位置。若索引是单列的,则该列的值为1,若索引是复合索引,则该列的值为该列在索引定义中的顺序
Column_name:表示定义索引的列字段
Collation:表示列以何种顺序存储在索引中,"A"表示升序,NULL表示无分类
Cardinality:索引中唯一值数目的估计值。基数根据被存储为整数的统计数据计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大
Sub_part:表示列中被编入索引的字符的数量,若列只是部分被编入索引,则该列的值为被编入索引的字符的数目,若整列被编入索引,则该列的值为NULL
Packed:指示关键字如何被压缩。若没有被压缩,则值为NULL
Null:用于显示索引列中是否包含NULL,若包含则为YES,若不包含则为NO
Index_type:显示索引使用的类型和方法(BTREE、FULLTEXT、HASH、RTREE)
Comment:显示评注
方式二
使用show iindex from 表名查询,比如查询articles表中的索引信息
方式三
使用desc 表名查询(信息较为简略)
4.6 删除索引
创建测试表
创建一个用户表用于测试索引的删除,表中包含用户的id、姓名和邮箱,并将这三列分别设置为主键索引、唯一索引和普通索引
删除主键索引
alter table 表名 drop primary key
删除非主键索引
alter table 表名 drop index 索引名
drop index 索引名 on 表名
注意:一个表只有一个主键索引,所以在删除主键索引时不用指明索引名,而一个表中可能有多个非主键索引,所以在删除非主键索引时需要指明索引名
4.7 索引创建原则
索引创建的原则如下:
- 比较频繁作为查询条件的字段应该创建索引
- 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
- 更新非常频繁的字段不适合创建索引
- 不会出现在where子句中的字段不应该创建索引