一张表的数据每天都在增加,这可能会降低性能。我在想我是否可以创建一个触发器将表 A 移动到 A1 并每隔一段时间创建一个新表 A,以便在表 A 中插入或更新可以更快。这是节省性能的正确方法吗?如果没有,我该怎么办? (比如A表每秒插入或更新1000行,3年后性能如何?)
我们正在为一家工厂设计软件。有制造 PCB 板的产品线。多年来,我们需要每秒插入近 60 条 pcb 记录。 (1000行好像有点夸张)
最佳答案
首先,您谈论的是单个表的数 TB 数据。你的盘有那么大吗?是的,MySQL 可以处理那么大的表。
它会变慢吗?这取决于
- 索引。如果您有“随机”索引,
INSERTs
将减慢到每次磁盘命中大约 1 次插入。在旋转的 HDD 上,每秒大约只有 100 个。 SSD 可能能够处理 1000/秒。请提供SHOW CREATE TABLE
。 - 表是否有
AUTO_INCREMENT
?如果是这样,它需要是BIGINT
,而不是INT
。但是,如果可能的话,一起摆脱它(以节省空间)。同样,让我们看看SHOW
。 - “点”查询(通过索引加载一行)大部分不受表大小的影响。它们在万亿行表中的速度大约是在百万行表中的两倍。一个点的查询需要几毫秒或几十毫秒;没什么大不了的。
- 表扫描需要数小时或数天;希望你没有那样做。
- 除非您使用
PRIMARY KEY
或具有“覆盖”索引,否则对部分表进行十亿行扫描将花费数天或数周时间。让我们看看查询和SHOW
。
最好的技术是不存储数据。在它到达时对其进行总结,保存摘要,然后扔掉原始数据。 (好的,您可以将原始数据存储在 csv 文件中,以防万一您需要构建新的汇总表或修复现有汇总表中的错误。)
用一些汇总表代替原始数据会将数据缩小到 1TB 以下,并使相关查询的运行速度提高 10 倍。 (好的,点查询只会稍微快一点。)
PARTITIONing
(或以其他方式拆分表)?这取决于。让我们看看查询和 SHOW
。在许多情况下,PARTITIONing
不会加速任何事情。
您要删除或修改现有行吗?我希望不是。这增加了问题的更多维度。另一方面,如果您需要清除“旧”数据,那么这非常适合PARTITIONing
。对于 3 年的数据,我将PARTITION BY RANGE(TO_DAYS(..))
并按月进行分区。然后每月 DROP PARTITION
会非常快。
关于Mysql表中数据过多怎么办,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52565060/