gpt4 book ai didi

mysql - 在一个巨大的表中处理删除/插入/选择

转载 作者:可可西里 更新时间:2023-11-01 07:59:11 26 4
gpt4 key购买 nike

我有一个约会网站。在这个网站上,我曾经每天向用户发送 10 张照片匹配并将它们存储在结构中作为

SENDER RECEIVER
11 1
12 1
13 1
14 1

我维护两个月的日志。用户也可以登录我的网站查看它们。

这意味着有并行插入和选择,这肯定不是问题。

问题是当用户变为非事件状态或删除其 ID 时,我需要从日志中删除 sender='inactive-id' 的所有条目。

日志的大小约为 6000 万。因此,每当这个巨大的表中出现删除查询时,所有选择都会被锁定,我的网站就会崩溃。

注意我的表是merge myisam因为我需要存储 2-3 个月的记录,并且在每个月的 1 日我更改定义

最佳答案

通常,Table 是被DELETE 语句锁定的最细粒度的对象。因此,通过使用 MERGE 表,您可以将几个可以独立锁定的对象组合成一个大对象,当 DELETE 命中其任何表时,该对象将被锁定。

MERGE 是一种针对很少或从不更改的表的解决方案:MERGE Table Advantages and Disadvantages .

你有两个选择:

最小化锁的影响:

  • 小批量删除
  • 在低负载时间运行删除作业
  • 如果不能为您节省太多空间,请考虑完全不删除
  • 不是删除行,而是将它们标记为“已删除”或已过时,并从 SELECT 查询中排除

锁定较小的对象(而不是一次锁定所有表):

  • 有几个 Delete 语句可以从每个基础表中删除
  • 删除 MERGE 定义,从创建 MERGE 的每个基础表中删除数据。但是,我认为您可以在不删除 MERGE 定义的情况下做到这一点。
  • 使用分区。

引自 MySQL 手册:

An alternative to a MERGE table is a partitioned table, which stores partitions of a single table in separate files. Partitioning enables some operations to be performed more efficiently and is not limited to the MyISAM storage engine. For more information, see Chapter 18, Partitioning.

我强烈主张分区,因为:- 您可以完全自动化您的日志记录/数据保留过程:脚本可以创建新的和删除空分区,将过时的数据移动到不同的表,然后截断该表。- 强制执行 key 唯一性- 只有包含要删除的数据的分区才会被锁定。其他分区上的选择正常运行。- 搜索同时在所有分区上运行(与 MERGE 一样),但您可以使用 HASH 子分区来进一步加快搜索速度。

但是,如果您认为分区的好处将被开发成本所抵消,那么您可能根本不应该删除该数据?

关于mysql - 在一个巨大的表中处理删除/插入/选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16646112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com