目录
一、索引的概念
二、索引的作用
索引的副作用:
三、创建索引的原则依据
MySQL 的优化 哪些字段/场景适合创建索引,哪些不适合
四、索引的分类和创建
4.1 普通索引
4.1.1 直接创建索引
4.1.2 修改表方式创建
4.1.3 创建表的时候指定索引
4.2 唯一索引
4.2.1 直接创建唯一索引
4.2.2 修改表方式创建
4.3 主键索引
4.3.1 创建表的时候指定
4.3.2 修改表方式创建
4.4 组合索引(单列索引与多列索引)
4.5 全文索引(FULLTEXT)
4.5.1 直接创建索引
4.5.2 修改表方式创建
4.5.3 创建表的时候指定索引
4.5.4 使用全文索引查询
五、查看索引
六、删除索引
6.1 直接删除索引
6.2 修改表方式删除索引
6.3 删除主键索引
七、总结
7.1 索引分类
7.2 索引创建
对于 MyISAM 引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。
而 InnoDB 引擎的表数据文件本身就是索引文件。
索引随可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。
因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,
然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。
最基本的索引类型,没有唯一性之类的限制。
CREATE INDEX 索引名 ON 表名 (列名[(length)]);
#(列名(length)):length是可选项。
如果忽略 length 的值,则使用整个列的值作为索引。
如果指定使用列前的 length 个字符来创建索引,这样有利于减小索引文件的大小。
#索引名建议以“_index”结尾。
例:create index phone_index on member (phone);
select phone from member;
show create table member;
ALTER TABLE 表名 ADD INDEX 索引名 (列名);
例:alter table member add index id_index (id);
select id from member;
select id,name from member;
CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));
例:create table class1(id int(4) not null,name varchar(10) not null,
cardid varchar(18) not null,index id_index (id));
show create table CLASS;
唯一索引允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。
添加唯一键将自动创建唯一索引。
CREATE UNIQUE INDEX 索引名 ON 表名(列名);
例:select * from member;
create unique index address_index on member (address);
create unique index name_index on member (name);
show create table member;
ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);
例:alter table member add unique cardid_index (cardid);
是一种特殊的唯一索引,必须指定为“PRIMARY KEY”。
一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引。
CREATE TABLE 表名 ([...],PRIMARY KEY (列名));
例:create table class3 (id int primary key,name varchar(20));
create table class4 (id int,name varchar(20),primary key (id));
show create table class3;
show create table class4;
ALTER TABLE 表名 ADD PRIMARY KEY (列名);
CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));
select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';
例:create table CLASS5 (id int not null,name varchar(20),cardid varchar(20),index index_amd (id,name));
show create table CLASS5;
insert into CLASS5 values(1,'zhangsan','123123');
select * from CLASS5 where name='zhangsan' and id=1;
注:
组合索引创建的字段顺序是其触发索引的查询顺序
CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);
例:select * from member;
create fulltext index remark_index on member (remark);
ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);
CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));
#数据类型可以为 CHAR、VARCHAR 或者 TEXT
SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');
show index from 表名;
show index from 表名\G; 竖向显示表索引信息
show keys from 表名;
show keys from 表名\G;
各字段的含义如下:
Table | 表的名称 |
Non_unique | 如果索引不能包括重复词,则为 0;如果可以,则为 1。 |
Key_name | 索引的名称。 |
Seq_in_index | 索引中的列序号,从 1 开始。 |
Column_name | 列名称。 |
Collation | 列以什么方式存储在索引中。在 MySQL 中,有值‘A’(升序)或 NULL(无分类)。 |
Cardinality | 索引中唯一值数目的估计值。 |
Sub_part | 如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为 NULL。 |
Packed | 指示关键字如何被压缩。如果没有被压缩,则为 NULL。 |
Null | 如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO。 |
Index_type | 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。 |
Comment | 备注。 |
DROP INDEX 索引名 ON 表名;
ALTER TABLE 表名 DROP INDEX 索引名;
ALTER TABLE 表名 DROP PRIMARY KEY;
PS:主键索引——》直接创建主键即可