MySQL 快速数据写入优化方法
针对你的 MySQL 插入命令速度慢的问题,以下是几种有效的优化方案:
1. 批量插入(最有效的方法)
mysql -uuniemm -pEmm@2020 --force -Demm_manager <<EOF
INSERT INTO person_info (name, birthday, age, gender) VALUES
('张三', '1990-05-15', 33, 'Male'),
('李四', '1985-08-20', 38, 'Female'),
('王五', '1995-03-10', 28, 'Male');
-- 可以一次性添加几百甚至上千条记录
EOF
优势:减少网络往返和SQL解析开销,性能可提升数十倍。
2. LOAD DATA INFILE(最快的大批量导入方式)
# 先创建CSV文件
echo '"张三","1990-05-15",33,"Male"' > data.csv
echo '"李四","1985-08-20",38,"Female"' >> data.csv
# 使用LOAD DATA导入
mysql -uuniemm -pEmm@2020 -Demm_manager -e "
LOAD DATA LOCAL INFILE 'data.csv'
INTO TABLE person_info
FIELDS TERMINATED BY ',' ENCLOSED BY '\"'
(name, birthday, age, gender)"
优势:比普通INSERT快10-100倍,特别适合上万条记录。
3. 临时调整MySQL配置(针对大批量导入)
-- 在导入前执行(会话级设置)
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
SET sql_log_bin=0;
-- 执行你的INSERT语句...
COMMIT; -- 最后统一提交
-- 恢复设置
SET autocommit=1;
SET unique_checks=1;
SET foreign_key_checks=1;
SET sql_log_bin=1;
4. Shell脚本生成批量SQL
#!/bin/bash
for i in {1..1000}; do
echo "('用户$i','199$((RANDOM%10))-$((RANDOM%12+1))-$((RANDOM%28+1))',$((RANDOM%50+18)),'$([ $((RANDOM%2)) -eq 0 ] && echo Male || echo Female)')"
done | sed "1s/^/INSERT INTO person_info (name, birthday, age, gender) VALUES /; \$!s/$/,/; \$s/$/;/" > bulk_insert.sql
mysql -uuniemm -pEmm@2020 -Demm_manager < bulk_insert.sql
5. Python等编程语言批量操作示例
import pymysql
db = pymysql.connect(host='localhost', user='uniemm', password='Emm@2020', database='emm_manager')
cursor = db.cursor()
data = [("张三", "1990-05-15", 33, "Male"),
("李四", "1985-08-20", 38, "Female")] * 500 # ×500次
query = "INSERT INTO person_info (name, birthday, age, gender) VALUES (%s,%s,%s,%s)"
cursor.executemany(query, data)
db.commit()
MySQL服务器端优化建议
如果可能,还可以考虑:
- 禁用索引:导入前删除索引,完成后再重建
- 增大缓冲区:临时增加
innodb_buffer_pool_size
- 使用事务:多条插入放在一个事务中
选择哪种方法取决于你的具体场景和数据量大小。对于少量数据(几十条),方法1足够;对于上万条数据,推荐方法2或4。
内容由零声教学AI助手提供,问题来源于学员提问