一个表中的数据每天都在增加,这可能会降低性能。我在想,如果我可以创建一个触发器,将表A移动到A1中,并每隔一段时间创建一个新表A,这样在表A中插入或更新可能会更快。这是节省性能的正确方法吗?如果没有,我应该怎么做?(例如,在表A中每秒插入或更新1000行,3年后性能如何?)
我们正在为一家工厂设计软件。有制造pcb板的生产线。几年来,我们每秒需要插入近60条pcb记录。(1000行似乎被夸大了)
发布于 2018-10-04 12:24:00
首先,一个表需要几个table的空间。你的磁盘有那么大吗?是的,MySQL可以处理这么大的一张桌子。
它会慢下来吗?这取决于
INSERTs
会减慢到每次磁盘命中大约1次插入。在旋转的硬盘上,这仅为每秒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
将会非常快。
发布于 2018-09-29 12:31:24
非常庞大的数据可能会降低服务器的性能,所以有一种方法可以解决这个问题:
1)您需要使用archive存储机制创建另一个表来存储归档数据(旧数据)。( https://dev.mysql.com/doc/refman/8.0/en/archive-storage-engine.html )
2)创建MySQL作业/调度程序,将较旧的记录移动到存档表。在服务器最大空闲时的时隙中进行调度。
3)将较旧的记录移至存档表后,对原始表重新建立索引。
这将服务于性能的目的。
发布于 2018-09-29 12:43:58
1000个行表的性能不太可能足够差,以至于每隔一段时间进行一次表复制就是总体的净收益。不管怎样,新的表有哪些旧表没有的可以提高性能的东西呢?
让表高效执行的关键是智能表设计和索引管理。这就是无数的行表在地理空间工作、图书馆目录、天文学以及互联网搜索引擎如何找到有用数据等方面的有效性。
定义的每个索引都会导致更多的mysql影响,尤其是在行插入时。假设读操作多于插入操作,这是一个优势,因为大多数查询都能快速完成,这要归功于合适的索引。
最好在对表的查询有透彻的理解的情况下定义索引-无论是在质量上还是在数量上。而且,如果查询的性质在几个月或几年中有任何趋势,那么索引将需要添加、修改或-是的-甚至删除。
https://stackoverflow.com/questions/52565060
复制相似问题