1

场景:包含 20 个 ID 字段的高事务表,这些字段链接到具有 BOTH 的其他表

  • WRITES:大量插入、更新和删除(通过一个进程/连接)
  • READS:数十个查询针对它运行,具有可变的选择标准,可能包括从 1 到所有 20 个 ID 字段(通过许多进程/连接)的任何地方。

鉴于您可以通过减少索引的数量来加速加载,并通过确保连接/过滤字段被索引来加速查询。在这个特定的表上,在加载期间暂时删除索引不是一个选项,因为查询可能会同时运行。

在大量阅读索引计划、使用复合索引、事务和表锁定之后,我完全糊涂了!

问题:

1.) 一般来说,由于不能选择删除索引(已经使用事务),因此应该通过表锁定最好地解决 UPDATE 问题吗?

2.)关于读取的索引计划,并考虑到每个选择的 ID 字段总数和可变字段数,最好是维护 20 个单独的索引加上一些最常见的化合物,还是实施某种排序散列?

在阅读了对类似主题的其他回复后,我意识到“一般”的答案是“一般”不赞成的。但是,我不确定如何使用 1 个键和 20 个 ID 字段以及用于删除、更新和插入查询的示例代码以及带有各种 ID 字段组合的十几个选择查询的示例代码来模拟一个表,这将说明任何问题比我更好(尽管可以接受其他意见!)。

感谢任何指导或参考(请注意,我已经在 MYSQL 文档中花费了大量时间)。

4

1 回答 1

1

所以对于 mysql 2-3 百万行并不是那么大。我有一个合适的索引计划,优化了 600,000,000+ 行表(~40GB)(尽管在那种情况下我知道并限制了我的 SELECT 范围以使事情更容易优化,那就是将大表作为 4 表的一部分加入)

在我的测试服务器上,一个包含 20 列 INT(11) 和 1,000,000 行的 InnoDB 表正好占用了 106MB(第一列只有一个主键)。第二个单列索引增加了 20MB。

在这一点上,我的建议是构建您的数据库结构,用具有代表性的数据量填充它并模拟您期望的负载。然后考虑您可能想要添加/删除的索引并对性能差异进行基准测试。

如果您随后遇到示例查询,您将无法在 stackoverflow 上优化询问。听起来您已经完成了研究。

如果您的数据库位于具有足够内存的盒子上(并且您正在使用 InnoDB),您可能需要查看调整 InnoDB 缓冲池:http ://dev.mysql.com/doc/refman/5.5/en/innodb-buffer -pool.html

如果您知道所有更新都来自单个进程但所有读取都来自多个源,您可能会发现主从复制可能有助于将读取负载分散到多个服务器上。http://dev.mysql.com/doc/refman/5.1/en/replication-solutions-scaleout.html

于 2013-11-08T10:17:52.063 回答