0

0

mysql如何添加索引 mysql创建索引的三种方法详解

看不見的法師

看不見的法師

发布时间:2025-07-04 19:36:02

|

1337人浏览过

|

来源于php中文网

原创

mysql中,为表添加索引有三种主要方法:1.使用create index语句,适用于已存在的表,语法为create index index_name on table_name (column_list);2.通过alter table add index语句,同样用于已有表,语法为alter table table_name add index index_name (column_list),还可添加唯一索引或主键;3.在create table语句中直接定义索引,这是最佳实践,可在建表时规划好主键、唯一索引和普通索引。这三种方式分别适用于不同场景,create index和alter table适用于对现有表进行优化,而create table则适合提前规划索引结构,提升查询效率并减少后期修改带来的开销。

mysql如何添加索引 mysql创建索引的三种方法详解

在MySQL中,为表添加索引是提升查询性能最直接也最有效的方法之一。核心上,这可以通过三种主要途径实现:使用独立的CREATE INDEX语句、通过ALTER TABLE命令修改现有表结构来添加,以及在创建新表时就直接定义好索引。理解并恰当运用这些方法,能让你的数据库查询效率得到质的飞跃。

mysql如何添加索引 mysql创建索引的三种方法详解

解决方案

mysql如何添加索引 mysql创建索引的三种方法详解

为MySQL表添加索引,主要有以下三种方法:

  1. 使用 CREATE INDEX 语句 这是最直接的索引创建方式,通常用于给已存在的表添加索引。它是一个独立的SQL语句,专门用于索引操作。

    mysql如何添加索引 mysql创建索引的三种方法详解
    CREATE INDEX index_name ON table_name (column1, column2, ...);

    例如,为users表的email列创建一个名为idx_email的普通索引:

    CREATE INDEX idx_email ON users (email);
  2. 使用 ALTER TABLE ADD INDEX 语句 这种方法也是针对已存在的表,通过修改表结构的方式来添加索引。在实际工作中,它和CREATE INDEX的最终效果类似,但语法上是作为ALTER TABLE命令的一部分。

    ALTER TABLE table_name ADD INDEX index_name (column1, column2, ...);

    你也可以添加其他类型的索引,比如唯一索引或主键:

    -- 添加唯一索引
    ALTER TABLE users ADD UNIQUE INDEX uniq_username (username);
    
    -- 添加主键(如果表中还没有主键)
    ALTER TABLE products ADD PRIMARY KEY (product_id);
  3. CREATE TABLE 语句中定义索引 这是在表创建之初就规划好索引的最佳实践。在定义表结构的同时,直接声明所需的索引,包括主键、唯一索引和普通索引。

    CREATE TABLE table_name (
        column1 datatype PRIMARY KEY, -- 主键
        column2 datatype UNIQUE,     -- 唯一索引
        column3 datatype,
        column4 datatype,
        INDEX index_name (column3, column4) -- 普通索引
    );

    例如,创建一个orders表,并在创建时就定义好主键和普通索引:

    CREATE TABLE orders (
        order_id INT PRIMARY KEY AUTO_INCREMENT,
        user_id INT,
        order_date DATETIME,
        total_amount DECIMAL(10, 2),
        INDEX idx_user_order_date (user_id, order_date)
    );

为什么我的查询这么慢?——索引的价值与选择

我刚开始接触数据库的时候,也经常遇到那种跑个查询要等半天的场景,当时真的非常抓狂。后来才明白,很多时候并不是数据量有多大,而是数据库在茫茫数据中“大海捞针”了。索引的价值就在于此,它就像一本书的目录,能让数据库系统快速定位到需要的数据行,而不是逐行扫描整个表。

想象一下,你有一张几百万行的用户表,如果想根据用户名查找某个用户,没有索引,数据库就得一行一行地找,直到找到为止。但如果username列上有一个索引,数据库就能通过索引的B+树结构,像查字典一样,迅速找到对应的用户名所在的数据页,大大减少了磁盘I/O和CPU的消耗。这种从“分钟级”到“毫秒级”的性能提升,体验过一次就再也回不去了。

不过,索引也不是万能药,它就像一把双刃剑。虽然能加速查询,但也会增加写入(插入、更新、删除)操作的开销,因为每次数据变动,索引也需要同步更新。而且,索引本身也需要占用存储空间。所以,选择哪些列加索引,加什么类型的索引,这都是需要深思熟虑的。通常我会考虑以下几点:

  • 查询频率高且条件明确的列:比如WHERE子句、JOIN条件、ORDER BYGROUP BY中经常出现的列。
  • 列的区分度(Cardinality):如果一个列的值重复率很高(比如性别),那索引的效果可能就不太好。我更倾向于给那些值比较分散、唯一性强的列加索引。
  • 复合索引的顺序:对于多列索引(复合索引),列的顺序非常重要。遵循“最左前缀原则”,把查询中最常用的列放在前面。
  • 避免过度索引:不是所有列都需要索引,小表、经常变动的列、区分度低的列,加索引可能弊大于利。

现有表如何优化?——使用ALTER TABLE ADD INDEX

Mulan AI
Mulan AI

画布式AI视频创作平台,轻松制作爆款视频

下载

对于已经投入使用的系统,我们经常会遇到需要对现有表进行性能优化的情况。这时候,ALTER TABLE ADD INDEX就成了我的首选工具。它的优势在于,你不需要重新创建整个表,只需简单地执行一条命令,就能为指定的列添加索引。

例如,你有一个products表,product_name列经常用于搜索,但之前没有加索引,导致查询速度慢。那么,你可以这样操作:

ALTER TABLE products ADD INDEX idx_product_name (product_name);

这条命令会通知MySQL在products表的product_name列上创建一个名为idx_product_name的普通索引。

需要注意的是,对于非常大的表,ALTER TABLE操作可能会导致表被锁定一段时间,这会影响线上业务的正常运行。在MySQL 5.6及更高版本中,引入了Online DDL特性,允许在添加索引时尽量减少或避免表锁定,但这依然需要根据具体的MySQL版本、存储引擎(InnoDB通常支持Online DDL更好)和操作类型来判断。在生产环境执行这类操作前,我总会先在测试环境模拟一遍,评估其对业务的影响。如果表真的非常大,我甚至会考虑采用一些更高级的技巧,比如先在一个临时表上创建索引,再进行表交换,以达到几乎无停机添加索引的目的。

新建表时如何未雨绸缪?——CREATE TABLE中的索引定义

我个人在设计数据库表结构时,总是尽可能地在CREATE TABLE阶段就把索引规划好。这就像盖房子前就把水电线路图画好,而不是等房子盖好了再凿墙布线。这种“未雨绸缪”的做法,不仅能让表结构更清晰,也能避免后期修改表结构带来的额外开销和潜在风险。

CREATE TABLE语句中定义索引,语法上非常直观。你可以直接在列定义后面加上PRIMARY KEYUNIQUE,或者在表定义的最后加上INDEXKEY来创建普通索引。

比如,我们要创建一个存储文章的articles表,通常会根据文章ID进行查询,也可能根据作者ID和发布日期进行组合查询:

CREATE TABLE articles (
    article_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '文章ID,主键',
    title VARCHAR(255) NOT NULL COMMENT '文章标题',
    author_id INT NOT NULL COMMENT '作者ID',
    publish_date DATETIME NOT NULL COMMENT '发布日期',
    content TEXT COMMENT '文章内容',
    INDEX idx_author_date (author_id, publish_date) COMMENT '作者ID和发布日期组合索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '文章表';

在这个例子中:

  • article_id INT PRIMARY KEY AUTO_INCREMENT:直接定义了article_id为主键,它自带唯一性和非空约束,是最高效的索引。
  • INDEX idx_author_date (author_id, publish_date):创建了一个名为idx_author_date的复合索引,覆盖了author_idpublish_date两列。这意味着,如果我需要查询某个作者在某个日期范围内的文章,这个索引就能派上大用场。

这种方式的好处在于,表一旦创建,索引就已经就位,无需额外的DDL操作。这对于后续的开发和部署流程来说,无疑是更简洁、更高效的选择。它强制你在设计阶段就考虑查询模式,从而构建出更健壮、性能更优的数据库结构。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

686

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

325

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

348

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1159

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

359

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

757

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

577

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

420

2024.04.29

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

45

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.9万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 810人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号