MySQL 大数据操作注意事项
MySQL大数据操作注意事项包括以下几点:
在删除操作中应尽量分批执行以减少等待时间;
更新操作应在开发环境中测试以避免生产环境出错;
创建索引时需考虑性能影响并遵循特定步骤;
OPTIMIZE命令需通过复制临时表完成;
引擎切换(如MyISAM到InnoDB)需经过多步过程且耗时较长;
保证SELECT操作优先级以避免性能瓶颈。
MySQL 大数据操作注意事项
**

**
目录
1. 关于删除操作
2. 关于执行更新操作
3. 关于建立索引结构
4. 关于执行优化查询
5. 关于更换当前使用的数据库引擎
6. 避免SELECT语句被阻止
1. 关于 delete
为了确保数据安全与稳定性,在进行大规模数据删除操作时,请您采取以下措施:首先将数据划分为合理规模的小批次进行处理;其次建议控制每次操作的数据量;此外建议您可以通过多线程或多节点集群实现并行处理功能;实现多线程或分布式处理以提高效率
mysql> show processlist;
+--------+-----------------+---------------------+-----------+---------+-------+-----------------------------+--------------------------------------------------------+
|Id|User|Host|db|Command|Time|State|Info|
+--------+-----------------+---------------------+-----------+---------+-------+-----------------------------+--------------------------------------------------------+
|1|event_scheduler|localhost|NULL|Daemon|52|Waiting for next activation|NULL|
|115986|dba|localhost|example|Query|0|NULL|show processlist|
|117446|dba|localhost|example|Query|20|updating|delete from mytable where OPEN_TIME like '2011.11.28%'|
|117525|dba|localhost|example|Query|2|updating|delete from mytable where OPEN_TIME like '2011.12.02%'|
|117526|dba|localhost|example|Query|49|updating|delete from mytable where OPEN_TIME like '2011.12.12%'|
|117527|dba|localhost|example|Query|6|updating|delete from mytable where OPEN_TIME like '2011.12.21%'|
|117528|dba|localhost|example|Query|64|updating|delete from mytable where OPEN_TIME like '2011.12.30%'|
|117546|dba|localhost|example|Query|33|updating|delete from mytable where OPEN_TIME like '2011.11.10%'|
+--------+-----------------+---------------------+-----------+---------+-------+-----------------------------+--------------------------------------------------------+
23 rows in set (0.00 sec)
2. 关于 update
在电商领域中,调价问题是一个普遍存在的挑战:即对多个商品的价格同时进行调整。通常涉及对多个商品价格进行同步调整。开发人员只需编写一段代码即可轻松完成这一操作。
update goods set price=price+10 where category_id = xxx
在开发,测试环境是可以通过测试的,一旦部署到生产环境,必死无疑
3. 关于创建索引
创建大型表的索引耗时漫长,并且一般都需要经过管理键和临时表复制的过程
mysql> show processlist;
+--------+-----------------+---------------------+----------+---------+-------+-----------------------------+------------------------------------------------------------------+
|Id|User|Host|db|Command|Time|State|Info|
+--------+-----------------+---------------------+----------+---------+-------+-----------------------------+------------------------------------------------------------------+
|1|event_scheduler|localhost|NULL|Daemon|47|Waiting for next activation|NULL|
|115986|dba|localhost|example|Query|0|NULL|show processlist|
|118814|dba|192.168.6.20:50459|example|Query|8|copy to tmp table|ALTER TABLE `mytable` ADD INDEX `modifiy_time` (`MODIFY_TIME`)|
+--------+-----------------+---------------------+----------+---------+-------+-----------------------------+------------------------------------------------------------------+
17 rows in set (0.00 sec)
删除索引,也需要经理 copy to tmp table 过程,漫长的等待
mysql> show processlist;
+--------+-----------------+---------------------+--------------+---------+-------+-----------------------------+-------------------------------------------------+
|Id|User|Host|db|Command|Time|State|Info|
+--------+-----------------+---------------------+--------------+---------+-------+-----------------------------+-------------------------------------------------+
|1|event_scheduler|localhost|NULL|Daemon|11|Waiting for next activation|NULL|
|115986|dba|localhost|example|Query|0|NULL|show processlist|
|118814|dba|192.168.6.20:50459|example|Query|4|copy to tmp table|ALTER TABLE `mytable` DROP INDEX `modifiy_time`|
+--------+-----------------+---------------------+--------------+---------+-------+-----------------------------+-------------------------------------------------+
17 rows in set (0.00 sec)
所以数据设计要深思熟虑,做到提前未雨绸缪,不要亡羊补牢
4. 关于 OPTIMIZE
OPTIMIZE 这一过程是将当前表复制至临时表后进行操作,并删除当前表。随后对临时表进行重命名为最终处理对象。
mysql> show processlist;
+--------+-----------------+---------------------+---------------------------+---------+-------+-----------------------------+--------------------------+
|Id|User|Host|db|Command|Time|State|Info|
+--------+-----------------+---------------------+---------------------------+---------+-------+-----------------------------+--------------------------+
|1|event_scheduler|localhost|NULL|Daemon|14|Waiting for next activation|NULL|
|115835|dba|192.168.6.20:49664|example|Query|9|copy to tmp table|OPTIMIZE TABLE `mytable`|
|115986|dba|localhost|example|Query|0|NULL|show processlist|
+--------+-----------------+---------------------+---------------------------+---------+-------+-----------------------------+--------------------------+
17 rows in set (0.00 sec)
5. 关于切换引擎
MySQL的ENGINE类型从MyISAM迁移至InnoDB的过程将依次经历创建新表、将现有数据复制至临时表以及完成表名重命名操作这几个关键步骤。整个迁移流程耗时较长。
mysql> show processlist;
+------+-----------------+---------------------+---------+---------+-------+-----------------------------+------------------------------------------+
|Id|User|Host|db|Command|Time|State|Info|
+------+-----------------+---------------------+---------+---------+-------+-----------------------------+------------------------------------------+
|1|event_scheduler|localhost|NULL|Daemon|10|Waiting for next activation|NULL|
|3167|dba|192.168.6.20:56723|example|Query|2|creating table|ALTER TABLE `mytable` ENGINE=InnoDB|
|3172|dba|localhost|example|Query|0|NULL|show processlist|
+------+-----------------+---------------------+---------+---------+-------+-----------------------------+------------------------------------------+
18 rows in set (0.00 sec)
copy to tmp table 过程
mysql> show processlist;
+------+-----------------+---------------------+---------+---------+-------+-----------------------------+------------------------------------------+
|Id|User|Host|db|Command|Time|State|Info|
+------+-----------------+---------------------+---------+---------+-------+-----------------------------+------------------------------------------+
|1|event_scheduler|localhost|NULL|Daemon|21|Waiting for next activation|NULL|
|3167|dba|192.168.6.20:56723|example|Query|13|copy to tmp table|ALTER TABLE `mytable` ENGINE=InnoDB|
|3172|dba|localhost|example|Query|0|NULL|show processlist|
+------+-----------------+---------------------+---------+---------+-------+-----------------------------+------------------------------------------+
18 rows in set (0.00 sec)
此时我们查看mysql data目录会看到临时表文件
# ll /var/lib/mysql/hx9999_real_history/
-rw-rw---- 1 mysql mysql 9522 May 16 17:17 #sql-c2f_c5f.frm
-rw-rw---- 1 mysql mysql 48 May 16 17:17 #sql-c2f_c5f.par
-rw-rw---- 1 mysql mysql 637534208 May 16 17:29 #sql-c2f_c5f#P#p0.ibd
-rw-rw---- 1 mysql mysql 180224 May 16 17:17 #sql-c2f_c5f#P#p1.ibd
-rw-rw---- 1 mysql mysql 180224 May 16 17:17 #sql-c2f_c5f#P#p2.ibd
-rw-rw---- 1 mysql mysql 180224 May 16 17:17 #sql-c2f_c5f#P#p3.ibd
-rw-rw---- 1 mysql mysql 180224 May 16 17:17 #sql-c2f_c5f#P#p4.ibd
-rw-rw---- 1 mysql mysql 180224 May 16 17:17 #sql-c2f_c5f#P#p5.ibd
-rw-rw---- 1 mysql mysql 180224 May 16 17:17 #sql-c2f_c5f#P#p6.ibd
-rw-rw---- 1 mysql mysql 180224 May 16 17:17 #sql-c2f_c5f#P#p7.ibd
6. 确保SELECT不被受阻
通过多种措施确保select操作能够顺利进行。若能持续有效连接至前端网站,则系统将可实现约80%的核心功能。若发生select操作中断,则整个系统的后续功能都将无法正常运转。
保证 select 操作优先于其他操作
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
[ORDER BY ...]
[LIMIT row_count]
update的时候增加 LOW_PRIORITY 参数,可以降低更新语句的优先级。
my.cnf
[mysqld]
low_priority_updates=1
或者启动是添加--low-priority-updates参数
全局开启
SET @@global.low_priority_updates = 1;
适用于本次会话连接
SET @@session.low_priority_updates = 1;
