MySql中索引的建立和删除

本文深入讲解MySQL数据库中索引的创建与删除,涵盖普通索引、唯一索引、全文索引、多列索引和空间索引的创建方法,以及如何通过SQL语句添加和删除各种类型的索引。

索引的建立和删除

1.MySql数据库中创建索引

在mysql中创建表的时候可以直接创建索引

CREATE TABLE 表名(字段名 数据类型 [完整性约束条件],
[UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY
[索引名](字段名1 [(长度)] [ASC | DESC])
)
示例:
CREATE TABLE index1 (id INT ,
name VARCHAR(20) ,
sex BOOLEAN ,
INDEX ( id) //声明索引
);

  • UNIQUE:可选。表示索引为唯一性索引。
  • FULLTEXT;可选。表示索引为全文索引。
  • SPATIAL:可选。表示索引为空间索引。
  • INDEX和KEY:用于指定字段为索引,两者选择其中之一就可以了,作用是一样的。
  • 索引名:可选。给创建的索引取一个新名称。
  • 字段名1:指定索引对应的字段的名称,该字段必须是前面定义好的字段。
  • 长度:可选。指索引的长度,必须是字符串类型才可以使用。
  • ASC:可选。表示升序排列。
  • DESC:可选。表示降序排列。

查看索引是否建立:

show create table;

查看索引是否使用:

EXPLAIN SELECT * FROM index1 where id =1 \G

1.1创建普通索引

创建普通索引不需要添加任何UNIQUE、FULLTEXT、或者SPATIAL关键字
示例:创建一个名为index1的数据库,并在表ID上建立一个普通索引

create table index1(id INT,
name VARCHAR(20),
sex BOOLEAN,
INDEX(id)
);

1.2创建唯一索引

使用UNIQUE进行约束,可创建唯一性索引

实例:创建一个名为index2的数据表,在表内的id字段上建立一个唯一性索引,并且设置id字段以升序的形式排列。

创建一个唯一性索引的SQL代码如下:
CREATE TABLE index2(id INT UNIQUE,
name VARCHAR(20),
UNIQUE INDEX index2_id(id ASC)
);

如上,在id字段上建立了名为id和index2_id的两个唯一性索引。这样做,可以提高数据的查询速度。
index2_id是为唯一性索引起的一个新名字。

如果在创建表index2时,id字段没有进行唯一约束,也可成功创建唯一索引,但可能达不到提高查询速度的目的

CREATE TABLE index2(id INT,
name VARCHAR(20),
UNIQUE INDEX index2_id(id ASC)
);

1.3创建全文索引

使用全文索引使用FULLTEXT参数,并且只能在CHAR、VARCHAR或TEXT类型的字段上个创建。
示例:

CREATE TABLE index3(id INT,
info VARCHAR(20),
FULLTEXT INDEX index3_info(info)
)ENGINE=MyISAM;

注意

  • ENGINE=MyISAM表明该表多用于查询,不支持事物,需经常备份数据库保证数据完成;
  • ENGINE=InnoDB表明该表支持事物操作。该类型表需要mysql5.6.19版本之后才可支持使用FULLTEXT创建全文搜索。
  • 全文索引适用于大型数据库,对于小的数据库用处较小。

1.4创建单列索引

单列索引是在数据表的单个字段上创建的索引。一个表中可以创建多个单列索引。唯一性索引和普通索引等都为单列索引。
实例:创建一个名为index4的数据表,在表中的subject字段上建立名为index4_st的单列索引。

CREATE TABLE index4(id INT,
subject VARCHAR(30),
INDEX index4_st(subject(10))
);

1.5创建多列索引

创建多列索引是在表的多个字段上创建一个索引。

实例:创建一个名为index5的数据表,在表中的name和sex字段上建立名为index5_ns的多列索引。

CREATE TABLE index5(id INT,
name VARCHAR(20),
sex CHAR(4),
INDEX index5_ns(name,sex)
);

注意

  • 多列索引中,只有查询条件中使用了这些字段中第一个字段时,索引才会被使用
  • 在优化查询速度时,可以考虑优化多列索引。

1.6创建空间索引

使用SPATIAL参数能够创建空间索引。创建空间索引时,表的存储引擎必须是MyISAM类型。而且,索引字段必须有非空约束。

实例:创建一个名为index6的数据表,在表中的space字段上建立名为index6_sp的空间索引。

CREATE TABLE index6(id INT,
space GEOMETRY NOT NULL,
SPATIAL INDEX index6_sp(space)
)ENGINE=MyISAM;

注意

  • space字段是非空的,而且数据类型是GEOMETRY类型。这个类型是空间数据类型。
  • 空间数据类型包括GEOMETRY、POINT、LINESTRING和POLYGON类型等。这些空间数据类型平时很少用到

2 添加索引

  1. 添加PRIMARY KEY(主键索引)

mysql>ALTER TABLE table_name ADD PRIMARY KEY ( column )

  1. 添加UNIQUE(唯一索引)

mysql>ALTER TABLE table_name ADD UNIQUE ( column )

  1. 添加INDEX(普通索引)

mysql>ALTER TABLE table_name ADD INDEX index_name ( column )

  1. 添加FULLTEXT(全文索引)

mysql>ALTER TABLE table_name ADD FULLTEXT ( column)

  1. 添加多列索引

mysql>ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 )

3.删除索引

DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY

其中,前两条语句是等价的,删除掉table_name中的索引index_name。

第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。

如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。

<think>我收到了用户的查询,他想了解MySQL索引创建删除的常用语法。用户提供了多个站内引用作为参考,我需要从中提取关键信息来构建答案。 首先,我查看这些引用内容。引用[1]提到索引的基本语法注意事项,强调了合理使用索引的重要性。引用[2]给出了具体的ALTER TABLE语句示例来创建索引。引用[3]补充了CREATE INDEX的两种形式:普通索引唯一索引。引用[4]详细说明了空间索引的限制创建表时定义索引的语法。引用[5]则指出索引的劣势,如占用空间影响写操作。 用户明确要求常用语法,所以我将重点放在最常用的创建删除方法上。对于创建索引,主要有两种方式:使用CREATE INDEX语句或ALTER TABLE语句。删除索引则对应使用DROP INDEX或ALTER TABLE DROP INDEX。 考虑到用户可能需要快速参考,我决定用清晰的代码块展示语法结构。同时,根据引用中提到的注意事项,我会在回答末尾添加使用建议,比如索引命名规范性能影响,这来自引用[1][5]的内容。 最后,按照用户要求,我需要生成相关问题。基于当前主题,自然联想到索引类型选择、性能优化等延伸方向,准备提出三个相关问题来帮助用户深入探索。 </think> 以下是MySQL索引创建删除的常用语法总结,结合核心操作注意事项: ### 一、索引创建语法 1. **CREATE INDEX 方式** ```sql -- 创建普通索引 CREATE INDEX index_name ON table_name (column_name); -- 创建唯一索引 CREATE UNIQUE INDEX index_name ON table_name (column_name); ``` *适用场景:表已存在时添加索引* 2. **ALTER TABLE 方式** ```sql -- 添加普通索引 ALTER TABLE table_name ADD INDEX index_name (column_name); -- 添加唯一索引 ALTER TABLE table_name ADD UNIQUE index_name (column_name); ``` *说明:与`CREATE INDEX`等效,但支持同时执行其他表修改操作*[^2][^3] 3. **建表时定义索引** ```sql CREATE TABLE table_name ( id INT NOT NULL, column1 VARCHAR(100), -- 定义普通索引 INDEX index_name (column1), -- 定义唯一索引 UNIQUE INDEX unique_index_name (id) ); ``` *注意:空间索引需指定存储引擎为MyISAM且字段为`NOT NULL`*[^4] --- ### 二、索引删除语法 ```sql -- 方法1(推荐) ALTER TABLE table_name DROP INDEX index_name; -- 方法2 DROP INDEX index_name ON table_name; ``` *删除后立即释放存储空间,但需确保索引名称正确* --- ### 三、关键注意事项 1. **命名规范** `index_name` 需唯一,推荐格式:`idx_表名_字段名` 2. **性能影响** - ✅ **优势**:加速查询速度(尤其WHERE/JOIN/ORDER BY) - ⚠️ **劣势**: - 占用额外存储(约数据表的1.5倍) - 降低写操作效率(INSERT/UPDATE/DELETE需维护索引)[^5] 3. **优化建议** - 仅为高频查询字段建索引 - 避免在更新频繁的列上建过多索引 - 定期分析慢查询优化索引策略[^1] > **示例操作流程**: > ```sql > -- 创建索引 > CREATE INDEX idx_users_email ON users(email); > > -- 验证索引 > SHOW INDEX FROM users; > > -- 删除索引 > ALTER TABLE users DROP INDEX idx_users_email; > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值