建立索引的目的是为了加快对表中记录的查找或排序:
为表设置索引也有代价需要付出:
下面列出创建索引的原则依据:
在 MySQL 中,可以使用命令创建多种类型的索引,也可以查看索引
创建好数据库及数据表,以备后续实例使用
create database class;
#创建库
use class
create table member (id int(10),name varchar(10),cardid varchar(18),phone varchar(11),address varchar(50),remark text);
#创建表
desc member;
#查看表结构
insert into member values (1,'wangyi','10010','111111','wuhan','this is vip');
insert into member values (2,'wanger','10020','222222','changsha','this is vip');
insert into member values (3,'wangsan','10030','333333','qingdao','this is normal');
insert into member values (4,'wangsi','10040','444444','nanjing','this is normal');
insert into member values (5,'wangwu','10050','555555','beijing','this is vip');
#在表中加入数据内容
select * from member;
#查看表中数据记录
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;
show create table member;
CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));
例:
create table test(id int(4) not null,name varchar(10) not null,cardid varchar(18) not null,index id_index (id));
show create table test;
CREATE UNIQUE INDEX 索引名 ON 表名(列名);
例:
create unique index address_index on member (address);
#注意,创建唯一索引必须得满足每个值都是唯一的,否则无法创建
show create table member;
ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);
例:
alter table member add unique cardid_index (cardid);
select cardid from member;
show create table member;
CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));
例:
create table test0 (id int,name varchar(20),unique id_index (id));
show creat table test0;
CREATE TABLE 表名 ([...],PRIMARY KEY (列名));
例:
create table test1 (id int primary key,name varchar(20));
#这里用了两种方式创建,一种是在字段中直接指定,第二种是在字段结束后指定
create table test2 (id int,name varchar(20),primary key (id));
show create table test1;
show create table test2;
ALTER TABLE 表名 ADD PRIMARY KEY (列名);
例:
alter table member add primary key (id);
show create table member;
CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);
例:
create fulltext index remark_index on member (remark);
#全文索引 fulltext,全文只可在 char、varchar、text 类型上创建,且每个表只允许有一个
show create table member;
ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);
CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));
#数据类型可以为 CHAR、VARCHAR 或者 TEXT
SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');
例:
select * from member where match(remark) against('this is vip');
CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));
select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';
例:
create table test001 (id int not null,name varchar(20),cardid varchar(20),index index_amd (id,name));
show create table test001;
insert into test001 values(1,'wangsansan','123123');
select * from test001 where name='wangsansan' and id=1;
show index from 表名;
show index from 表名\G;
#在命令后面加上“\G”,可以竖向显示索引的信息
或
show keys from 表名;
show keys from 表名\G;
#这两种方法的显示结果完全相同
例:
show index from member;
索引的详细信息:
显示参数 | 描述 |
---|---|
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 | 备注 |