mysql索引

索引分类

1.普通索引:不附加任何限制条件,可创建在任何数据类型中

2.唯一性索引:使用unique参数可以设置索引为唯一性索引,在创建索引时,限制该索引的值必须唯一,主键就是一种唯一性索引

3.全文索引:使用fulltext参数可以设置索引为全文索引。全文索引只能创建在char、varchar或text类型的字段上。查询数据量较大的字符串类型字段时,效果明显。但只有MyISAM存储引擎支持全文检索

4.单列索引:在表中单个字段上创建的索引,单列索引可以是任何类型,只要保证索引只对应一个一个字段

5.多列索引:在表中多个字段上创建的索引,该索引指向创建时对应的多个字段

6.空间索引:使用spatial参数可以设置索引为空间索引,空间索引只能建立在空间数据类型上比如geometry,并且不能为空,目前只有MyISAM存储引擎支持

示例表:

CREATE TABLE `DICTIONARY_ITEM` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '唯一标识',
  `dic_id` bigint(20) NOT NULL COMMENT '数据字典表中字典Id',
  `dic_item_key` varchar(255) DEFAULT NULL COMMENT '字典编码',
  `dic_item_value` varchar(512) DEFAULT NULL COMMENT '值',
  `dic_item_alias` varchar(512) DEFAULT NULL COMMENT '别名',
  `status` int(2) DEFAULT '1' COMMENT '状态',
  `parent_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '父项ID',
  `product_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '产品ID',
  `tenant_id` varchar(64) NOT NULL DEFAULT '0' COMMENT '租户ID',
  `create_by` varchar(64) NOT NULL DEFAULT '0' COMMENT '创建人账号',
  `update_by` varchar(64) DEFAULT NULL COMMENT '修改人账号',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_value` (`dic_id`,`dic_item_value`,`product_id`,`parent_id`) USING BTREE,
  KEY `dic_idx` (`dic_item_value`,`product_id`),
  KEY `dic_translate_idx` (`dic_id`,`status`,`product_id`,`parent_id`),
  KEY `dic_item_idx` (`dic_id`,`dic_item_value`,`product_id`,`parent_id`)
) ENGINE=InnoDB AUTO_INCREMENT=240638329 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
--主键索引
PRIMARY KEY (`id`)
--唯一联合索引
UNIQUE KEY `unique_value` (`dic_id`,`dic_item_value`,`product_id`,`parent_id`) USING BTREE
--普通联合索引
KEY `dic_idx` (`dic_item_value`,`product_id`)
KEY `dic_translate_idx` (`dic_id`,`status`,`product_id`,`parent_id`)
KEY `dic_item_idx` (`dic_id`,`dic_item_value`,`product_id`,`parent_id`)

创建索引

在创建表时创建索引

--创建普通索引
create table index1(
id int,
name varchar(20),
sex boolean,
index(id)
);

此处在id字段上创建索引,show create table可查看

--创建唯一性索引
create table index2(
id int unique,
name varchar(20),
unique index index2_id(id ASC)
);

此处使用id字段创建了一个名为index2_id的索引

这里的id字段可以不设置唯一性约束,但这样一来索引就没有作用

--创建全文索引
create table index3(
id int,
info varchar(20),
fulltext index index3_info(info)
)engine=MyISAM;

要注意创建全文索引时只能使用MyISAM存储引擎

--创建单列索引
create table index4(
id int,
subject varchar(30),
index index4_st(subject(10))
);

此处subject字段长度是30,而索引长度则是10

这么做的目的在于提高查询速度,对于字符型的数据不用查询全部信息

--创建多列索引
create table index5(
id int,
name varchar(20),
sex char(4),
index index5_ns(name,sex)
);

可以看出,这里使用了name字段和sex字段创建索引列

--创建空间索引
create table index6(
id int,
space geometry not null,
spatial index index6_sp(space)
)engine=MyISAM;

这里需要注意空间space字段不能为空,还有存储引擎

在已经存在的表上创建索引

--创建普通索引
create index index7_id on example0(id);

这里在现有表的id字段上创建了一条名为index7_id的索引

--创建唯一性索引
create unique index index8_id on example1(course_id);

此处只需要在index关键字前面加上unique即可

至于表中的course_id字段,最要也设置唯一性约束条件

--创建全文索引
create fulltext index index9_info on example2(info);

fulltext关键字用来设置全文引擎,此处的表必须是MyISAM存储引擎

--创建单列索引
create index index10_addr on example3(address(4));

此表中address字段的长度是20,这里只查询4字节,不需要全部查询

--创建多列索引
create index index11_na on example4(name,address);

索引创建好之后,查询中必须有name字段才能使用

--创建空间索引
create spatial index index12_line on example5(space);

这里需要注意存储引擎是MyISAM,还有空间数据类型

用alter table语句来创建索引

--创建主键索引
ALTER TABLE table_name ADD PRIMARY KEY (column_list)

--创建普通索引
mysql> alter table example6 add index `index13_n`(name(20));

--创建唯一性索引
alter table example7 add unique `index` index14_id(id);

--创建全文索引
alter table example8 add fulltext `index` index15_info(info);

--创建单列索引
alter table example9 add index `index16_addr`(address(4));

--创建多列索引
alter table example10 add index `index17_in`(id,name);

--创建空间索引
alter table example11 add spatial index `index18_space`(space);

到此,三种操作方式,每种索引类别的建立就都列举了

对于索引,重要的是理解索引的概念,明白索引的种类

更多的是自己的使用经验

删除索引

--删除索引
-- table_name表名,column_list列名,index_name索引名
-- 删除index索引
ALTER TABLE table_name DROP INDEX index_name
DROP INDEX index_name ON talbe_name
-- 删除主键索引(只能用ALTER)
ALTER TABLE table_name DROP PRIMARY KEY
-- 删除唯一索引
ALTER TABLE table_name DROP INDEX column_list;
ALTER TABLE table_name DROP INDEX index_name
DROP INDEX index_name ON talbe_name

查看索引

SHOW INDEX FROM table_name;
SHOW KEYS FROM table_name;


mysql索引
https://www.hechunyu.com/archives/mysqlsuo-yin
作者
chunyu
发布于
2020年08月17日
许可协议