创建索引主要有三种时机:

1) 建表时同时创建;

2) 修改已存在的表结构时添加;

3) 使用专门的 `CREATE INDEX` 语句为已存在的表添加。

 

一、三种创建索引的方法

方法 1: 使用 `CREATE INDEX` 语句 (最常用)

专门用于在已存在的表上创建索引(不能创建主键)。

 

语法:

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX <索引名>

ON <表名> (<列名> [(<长度>)]] [ASC | DESC], ...);

 

 

参数说明:   `UNIQUE`: 创建唯一索引。

   `FULLTEXT`: 创建全文索引(用于文本搜索)。

   `SPATIAL`: 创建空间索引(用于地理数据)。

   `<索引名>`: 索引的名称,必须在表中唯一。

   `<表名>`: 要创建索引的目标表。

   `<列名>`: 要建立索引的列。可以指定多列创建复合索引。

   `<(长度)>`: 可选。用于前缀索引,只对列的前 N 个字符创建索引,能减小索引大小。常用于字符串类型的列。

   `ASC|DESC`: 可选。指定索引的排序顺序,升序或降序。默认为 `ASC`。

 

示例:

 在 `users` 表的 `email` 列上创建一个普通索引

CREATE INDEX idx_email ON users (email);

 

 在 `products` 表的 `name` 列前20个字符上创建索引

CREATE INDEX idx_name_prefix ON products (name(20));

 

 在 `orders` 表上创建 `user_id` 和 `order_date` 的复合索引

CREATE INDEX idx_user_order ON orders (user_id, order_date DESC);

 

方法 2: 使用 `CREATE TABLE` 语句

在创建新表的同时定义索引。

语法(内联在列定义中):

CREATE TABLE table_name (
    id INT NOT NULL PRIMARY KEY,  --创建主键索引
    name VARCHAR(100),
    email VARCHAR(100) UNIQUE,    --创建唯一约束(自动生成唯一索引)
    age INT,
    KEY idx_age (age),            --创建普通索引,索引名为 idx_age
    INDEX idx_name (name)         --创建普通索引,同上
);

语法(在语句末尾定义): (更适合复合索引和主键)

CREATE TABLE table_name (
    id INT NOT NULL,
    name VARCHAR(100),
    email VARCHAR(100),
    age INT,
    PRIMARY KEY (id),            -- 创建主键索引
    UNIQUE KEY uk_email (email),  --创建唯一索引,命名为 uk_email
    KEY idx_age_name (age, name)  --创建复合索引,包含 age 和 name 两列
);

 方法 3: 使用 `ALTER TABLE` 语句

在修改已存在的表时添加索引。功能上与 `CREATE INDEX` 类似,但语法不同。

 

语法:

ALTER TABLE <表名>

ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX [<索引名>] (<列名> [(<长度>)] [ASC | DESC], ...);

 或者添加主键

ALTER TABLE <表名> ADD PRIMARY KEY (<列名>);

 

示例:

 为已存在的 `articles` 表添加一个普通索引

ALTER TABLE articles ADD INDEX idx_created_at (created_at);

 为 `users` 表添加唯一索引

ALTER TABLE users ADD UNIQUE INDEX uk_username (username);

 为 `posts` 表添加主键(如果原来没有)

ALTER TABLE posts ADD PRIMARY KEY (id);

二、创建不同类型的索引示例

1. 创建普通索引 (INDEX/KEY)

最常见的索引,仅用于加速查询,不强制唯一性。

方法1

CREATE INDEX idx_height ON tb_stu_info (height);

 方法2 (建表时)

CREATE TABLE tb_stu_info (
    id INT,
    name CHAR(45),
    height INT,
    INDEX (height)  --或 KEY (height)
);

 方法3

ALTER TABLE tb_stu_info ADD INDEX idx_height (height);
`SHOW CREATE TABLE` 输出: `KEY ``height`` (``height``)`

2. 创建唯一索引 (UNIQUE INDEX)

保证索引列的值必须是唯一的,可以有一个 NULL 值(除非列被定义为 `NOT NULL`)。

 方法1

CREATE UNIQUE INDEX uid_height ON tb_stu_info2 (height);

 

 方法2 (建表时)

CREATE TABLE tb_stu_info2 (
    id INT,
    height INT,
    UNIQUE INDEX (height) -- 或 UNIQUE KEY (height)
);

 

 方法3

ALTER TABLE tb_stu_info2 ADD UNIQUE INDEX uid_height (height);
`SHOW CREATE TABLE` 输出: `UNIQUE KEY ``height`` (``height``)`

                                                                       

 3. 创建主键索引 (PRIMARY KEY)

特殊的唯一索引,不允许有空值。每张表只能有一个主键。

 方法2 (建表时最常见)

CREATE TABLE tb_stu_info3 (
    id INT NOT NULL PRIMARY KEY, -- 内联方式
    name VARCHAR(100)
);

 

CREATE TABLE tb_stu_info3 (
    id INT NOT NULL,
    name VARCHAR(100),
    PRIMARY KEY (id) -- 末尾方式
);

 方法3

ALTER TABLE tb_stu_info3 ADD PRIMARY KEY (id);

4. 创建复合索引 (Composite Index)

基于多个列的索引

CREATE INDEX idx_dept_age ON tb_stu_info (dept_id, age);

 

使用场景: 查询条件同时包含 `dept_id` 和 `age` 时,或者仅包含 `dept_id` 时,该索引都可能被用到(最左前缀原则)。

 

5. 创建前缀索引 (Prefix Index)

只对字符串列的前面一部分字符创建索引,节省空间。

CREATE INDEX idx_name_prefix ON tb_stu_info (name(10)); --只索引前10个字符

三、方法对比与选择

 特性  CREATE INDEX  CREATE TABLE  ALTER TABLE

使用时机 表已存在  创建新表时  表已存在

功能 可创建各种索引(除主键)  可创建所有类型的索引  可创建所有类型的索引

可读性 高。意图明确,就是创建索引。  中。索引定义与表结构混在一起。  中。是修改表结构的一部分。

常用场景 最常用。在表上线后优化性能。  建表时已知需要的索引。  在批量修改表结构时同时添加索引。

点赞(1)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)