在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 操作来提高效率。此外,利用脚本和多线程技术,可以更好地管理和优化这些并行操作。

相关推荐
zhangjin1222几秒前
kettle从入门到精通 第九十四课 ETL之kettle MySQL Bulk Loader大批量高性能数据写入
大数据·数据仓库·mysql·etl·kettle实战·kettlel批量插入·kettle mysql
深圳厨神9 分钟前
mysql对表,数据,索引的操作sql
数据库·sql·mysql
谁家有个大人10 分钟前
数据分析问题思考路径
数据库·数据分析
hweiyu0012 分钟前
从JVM到分布式锁:高并发架构设计的六把密钥
jvm·redis·分布式·mysql·etcd
小陈又菜20 分钟前
MySQL-触发器
数据库·mysql·database·触发器
爱的叹息25 分钟前
详解隔离级别(4种),分别用表格展示问题出现的过程及解决办法
数据库·oracle
平凡的小y26 分钟前
MySQL内置函数
数据库·mysql
佩奇的技术笔记34 分钟前
中级:MyBatis面试题深度剖析
数据库·mybatis
慕丹36 分钟前
虫洞数观系列三 | 数据分析全链路实践:Pandas清洗统计 + Navicat可视化呈现
python·mysql·数据挖掘·数据分析·pandas
luluoluoa1 小时前
SQL、mySQL与SQLite简单理解
sql·mysql·sqlite