使用大量数据在现有 table 上创建 MySQL 索引
Create a MySQL index on already existing table with a lot of data
我有一个 Spring 引导服务和 MySQL 数据库 (AWS RDS)。
有一个特定的 table,包含大约 200 万行,对它的一些查询使 CPU 上升到数据库实例。
我注意到使用的列上没有索引,所以我想尝试添加这个索引。
问题是:
- 我可以在 table 上添加(没有任何问题)这个索引吗
已经包含很多行?我正在使用 Flyway 来管理数据库
迁移。
- 特定列包含字符串,是否有一些
其他索引配置更适合这种情况?
一些附加信息:
MySQL 版本为 5.7.33
;
table目前不包含任何其他关系;
table很简单,报告如下:
创建 TABLE 如果不存在 info
(
field_1
varchar(36) 不为空,
field_2
文本默认为空,
my_key
varchar(36) 默认为空,
field_3
varchar( 255) 默认为空,
field_4
varchar(10) 默认为空,
field_4
varchar(10) 默认为空,
field_6
varchar(10) 默认为空,
field_7
varchar(36)NOT NULL,
creation_date
日期时间默认为空,
modification_date
日期时间默认为空,
主键(field_1
)
) 引擎=InnoDB 默认字符集=utf8;
table 现在包含大约 2 百万 行;
查询类似于:
SELECT * 来自信息 WHERE my_key = "xxxx"
而且会执行很多次
想法是创建这个索引:
CREATE INDEX my_key ON info (my_key);
使用 MySql 的更新版本,您可以 create an index 而无需锁定 table:
The table remains available for read and write operations while the index is being created. The CREATE INDEX statement only finishes after all transactions that are accessing the table are completed, so that the initial state of the index reflects the most recent contents of the table.
显然创建索引对数据库来说是一项额外的工作,因此如果您的数据库处于痛苦状态,请尝试在数据库上执行的活动减少时更新索引。
我有一个 Spring 引导服务和 MySQL 数据库 (AWS RDS)。
有一个特定的 table,包含大约 200 万行,对它的一些查询使 CPU 上升到数据库实例。
我注意到使用的列上没有索引,所以我想尝试添加这个索引。
问题是:
- 我可以在 table 上添加(没有任何问题)这个索引吗 已经包含很多行?我正在使用 Flyway 来管理数据库 迁移。
- 特定列包含字符串,是否有一些 其他索引配置更适合这种情况?
一些附加信息:
MySQL 版本为
5.7.33
;table目前不包含任何其他关系;
table很简单,报告如下:
创建 TABLE 如果不存在
info
(field_1
varchar(36) 不为空,field_2
文本默认为空,my_key
varchar(36) 默认为空,field_3
varchar( 255) 默认为空,field_4
varchar(10) 默认为空,field_4
varchar(10) 默认为空,field_6
varchar(10) 默认为空,field_7
varchar(36)NOT NULL,creation_date
日期时间默认为空,modification_date
日期时间默认为空,主键(
field_1
)) 引擎=InnoDB 默认字符集=utf8;
table 现在包含大约 2 百万 行;
查询类似于:
SELECT * 来自信息 WHERE my_key = "xxxx"
而且会执行很多次
想法是创建这个索引:
CREATE INDEX my_key ON info (my_key);
使用 MySql 的更新版本,您可以 create an index 而无需锁定 table:
The table remains available for read and write operations while the index is being created. The CREATE INDEX statement only finishes after all transactions that are accessing the table are completed, so that the initial state of the index reflects the most recent contents of the table.
显然创建索引对数据库来说是一项额外的工作,因此如果您的数据库处于痛苦状态,请尝试在数据库上执行的活动减少时更新索引。