Advertisement

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;

全部评论 (0)

还没有任何评论哟~