在MySQL中添加索引

在添加之前可以做下备份

bash 复制代码
mysqldump -u 用户名 -p 数据库名 表名 > 备份文件.sql

在 MySQL 中,虽然可以同时执行多个 ALTER TABLE 语句,但需要注意的是,MySQL 对 ALTER TABLE 操作的并行执行有一些限制。具体来说,MySQL 在执行 ALTER TABLE 操作时会对表进行锁定(通常是表级锁),这意味着对于同一个表的多个 ALTER TABLE 操作无法同时进行。然而,对于不同的表,可以并行执行这些操作。

同时对多个表添加索引

如果要对不同的表添加索引,这些操作可以同时进行,因为每个表的 ALTER TABLE 操作是独立的。例如:

sql 复制代码
ALTER TABLE orders ADD INDEX idx_order_date (order_date);
ALTER TABLE customers ADD INDEX idx_email (email);
ALTER TABLE products ADD INDEX idx_category_id (category_id);
ALTER TABLE products ADD INDEX idx_price (price);
ALTER TABLE products ADD INDEX idx_stock_quantity (stock_quantity);

可以在多个数据库连接中分别执行上述命令,以实现并行操作。

同时对同一个表添加多个索引

对于同一个表,虽然不能在同一时间并行执行多个 ALTER TABLE 语句,但可以在一个 ALTER TABLE 语句中添加多个索引。这是一种更高效的方法,因为它只需要一次表锁定和数据扫描。

示例:在一个操作中为 products 表添加多个索引
sql 复制代码
ALTER TABLE products 
ADD INDEX idx_category_id (category_id), 
ADD INDEX idx_price (price), 
ADD INDEX idx_stock_quantity (stock_quantity);

使用多线程并行执行

如果你使用的是 MySQL 8.0 或更高版本,可以利用 MySQL 的并行执行能力,特别是对于大表和复杂的索引操作,这可能会有显著的性能提升。

使用脚本并行执行

如果你希望利用多核 CPU 的优势来并行处理多个 ALTER TABLE 操作,可以编写一个脚本(如 shell 脚本)来在多个 MySQL 会话中并行执行这些命令。

示例:Shell 脚本并行执行

以下是一个简单的 bash 脚本示例,用于并行执行 ALTER TABLE 命令:

bash 复制代码
#!/bin/bash

# MySQL 用户名和密码
USER="root"
PASSWORD="password"
DATABASE="aaa"

# 在后台执行 ALTER TABLE 命令
mysql -u ${USER} -p${PASSWORD} -e "ALTER TABLE orders ADD INDEX idx_order_date (order_date);" ${DATABASE} &
mysql -u ${USER} -p${PASSWORD} -e "ALTER TABLE customers ADD INDEX idx_email (email);" ${DATABASE} &
mysql -u ${USER} -p${PASSWORD} -e "ALTER TABLE products ADD INDEX idx_category_id (category_id);" ${DATABASE} &
mysql -u ${USER} -p${PASSWORD} -e "ALTER TABLE products ADD INDEX idx_price (price);" ${DATABASE} &
mysql -u ${USER} -p${PASSWORD} -e "ALTER TABLE products ADD INDEX idx_stock_quantity (stock_quantity);" ${DATABASE} &

# 等待所有后台任务完成
wait

echo "所有索引添加操作已完成"

执行脚本说明

  1. mysql -u ${USER} -p${PASSWORD} -e:在 MySQL 中执行 SQL 语句的命令。
  2. &:将命令放入后台执行,以实现并行处理。
  3. wait:等待所有后台任务完成。

注意事项

  • 系统资源 :并行执行多个 ALTER TABLE 操作会消耗更多的系统资源(CPU、内存和磁盘I/O),需要确保服务器有足够的资源支持并行操作。
  • 事务和锁定:对于涉及大量数据修改的操作,应考虑使用事务和适当的锁定策略,确保数据一致性。
  • 备份和恢复:在进行大规模索引操作之前,建议先备份数据,以防操作过程中出现问题。

总结

虽然 MySQL 对同一个表的 ALTER TABLE 操作有锁定限制,但可以通过在同一个 ALTER TABLE 命令中添加多个索引,或在不同表上并行执行 ALTER TABLE 操作来提高效率。此外,利用脚本和多线程技术,可以更好地管理和优化这些并行操作。

相关推荐
码不停蹄的玄黓1 分钟前
MySQL唯一索引能否做主键索引
数据库·sql·mysql
段一凡-华北理工大学13 分钟前
工业领域的Hadoop架构学习~系列文章09:HBase列式数据库
数据库·人工智能·hadoop·架构·hbase·高炉炼铁·高炉炼铁智能化
江畔柳前堤16 分钟前
XZ09_Word和MD格式转换
开发语言·数据库·人工智能·python·深度学习·word
移动云开发者联盟20 分钟前
信创版图加速扩展!移动云云数据库Redis通过安全可信认证
数据库·安全
小马爱打代码24 分钟前
SpringBoot + 本地缓存 + 布隆过滤器:防止恶意 ID 查询打穿数据库
数据库·spring boot·缓存
憧憬成为java架构高手的小白24 分钟前
数据库期末复习笔记
数据库·笔记·oracle
10WTW0127 分钟前
个人思考记录(一)What u need in AI era
数据库·mongodb
六月雨滴31 分钟前
Oracle 性能监控体系概述
数据库·oracle·dba
小旭952732 分钟前
MySQL 主从复制、MyCat 读写分离与分库分表实战
java·数据库·sql·mysql·database
计算机安禾32 分钟前
【算法分析与设计】第38篇:最近点对与分治在几何中的应用
java·服务器·网络·数据库·算法