Mysql表中数据过多怎么办

标签 mysql database performance

一张表的数据每天都在增加,这可能会降低性能。我在想我是否可以创建一个触发器将表 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/

相关文章:

PHP - in_array、循环和 if 语句

mysql - 使用 NOT IN 子查询返回 0 行的查询

php - 通过 ORM 将扩展的 Kohana DB 类用于多个数据库

sql - 在触发器执行之前数据库关闭会发生什么?

java - 返回 null 的构造函数的替代方案

php - PDO SQL 单查询、多行和值

php - PHP-->MySQL 中 bool 错误时调用成员函数 bind_param()

sql - H2。将字符串插入 VARBINARY(255)

c# - File.Copy 与手动 FileStream.Write 用于复制文件

c++ - IUpdateSearcher 性能问题