很快我们就需要对生产数据库进行架构更改.我们需要尽量减少这项工作的停机时间,但是,ALTER TABLE语句将运行很长一段时间.我们最大的表有1.5亿条记录,最大的表格文件是50G.所有表都是InnoDB,它被设置为一个大数据文件(而不是每个表的文件).我们在8核机器,16G内存和RAID10配置上运行MySQL 5.0.46.
我有一些MySQL调优的经验,但这通常集中在来自多个客户端的读取或写入.有关此主题的互联网上有很多信息,但是,关于(暂时)调整MySQL服务器以加速InnoDB表上的ALTER TABLE或INSERT INTO的最佳实践,似乎很少有信息可用. .SELECT FROM(我们可能会使用它而不是ALTER TABLE来获得更多机会来加快速度).
我们计划进行的架构更改是向所有表添加一个整数列,并将其作为主键,而不是当前主键.我们还需要保留"旧"列,因此不能覆盖现有值.
尽可能快地完成这项任务的理想设置是什么?
我正在寻找一些关于如何更好地优化此查询的建议.
对于每条_piece_detail记录:
_scan记录(zip,zip_4,zip_delivery_point,serial_number)mailing_groups(通过一系列关系)first_scan_date_time这大于MIN(scan_date_time)相关的_scan记录latest_scan_date_time这比MAX(scan_date_time)相关_scan记录少我需要:
_piece_detail.first_scan_date_time为MIN(_scan.scan_date_time)_piece_detail.latest_scan_date_time为MAX(_scan.scan_date_time)由于我正在处理数百万条记录,因此我试图减少实际需要搜索的记录数.以下是有关数据的一些事实:
job_id,所以它似乎最有意义通过的顺序这些检查运行
_piece_detail.job_id,_piece_detail.piece_id._piece_detail(除scan_date_time之外)的密钥相同._piece_detail记录属于a mailing_group,但在我们完成连接的完整关系之前,我们不知道它们是哪些._piece_detaila mailing_group._scan每个通常有0到4个记录_piece_detail.现在,我正在寻找一种以合适的方式执行此操作的方法.我最初是从这样的事情开始的:
UPDATE _piece_detail
INNER JOIN (
SELECT _piece_detail.job_id, _piece_detail.piece_id, MIN(_scan.scan_date_time) as first_scan_date_time, MAX(_scan.scan_date_time) as latest_scan_date_time
FROM _piece_detail
INNER JOIN _container_quantity
ON _piece_detail.cqt_database_id = _container_quantity.cqt_database_id
AND …Run Code Online (Sandbox Code Playgroud) 我有一个带有索引varchar(256)列的表.
为了加快批量插入,我禁用了密钥,插入了超过1000万个条目,然后在插入完成后重新启用密钥.
令人惊讶的是,启用/禁用键没有时间:
mysql> alter table xxx disable keys; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> alter table xxx enable keys; Query OK, 0 rows affected, 1 warning (0.00 sec)
如何确保启用/禁用密钥正常工作?
mysql ×3
performance ×2
alter-table ×1
bulkinsert ×1
indexing ×1
mysql-5.6 ×1
optimization ×1
sql ×1