gpt4 book ai didi

mysql - 如何在rails中进行mysql表分区?

转载 作者:行者123 更新时间:2023-11-29 17:54:29 26 4
gpt4 key购买 nike

我正在开发 Rails Web 框架,该框架有一个 mysql 表 exam_scores,包含 3500 万条记录(可能在 2 年内翻倍!)。 exam_scores 表具有索引 index_exam_scores_on_student_id_and_exam_id 。执行查询仍然需要大量时间,因为它是一个巨大的表!所以我正在寻找解决方案来处理这种情况。

SHOW CREATE TABLE exam_scores;

CREATE TABLE `exam_scores` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`student_id` int(11) DEFAULT NULL,
`exam_id` int(11) DEFAULT NULL,
`marks` decimal(7,2) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`year` int(11) DEFAULT NULL,
`result` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `index_exam_scores_on_student_id_and_exam_id` (`student_id`,`exam_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3542275 DEFAULT CHARSET=utf8

我想知道如何在 mysql 中进行表分区,因为我希望这是唯一的解决方案。是否可以?如果是,如何在现有表上执行此操作而不丢失数据并影响代码。

最佳答案

分区对性能几乎没有帮助。为了帮助您,我们必须查看速度缓慢的查询。 也许有些人可以得到帮助。

同时,还有其他一些可能可以提高性能的事情。

  • 您有数十亿学生吗?您可能不需要 student_idexam_id 的 4 字节 INT。选择较小的数据类型,例如 2 字节 SMALLINT UNSIGNED(范围为 0..65535),会缩小数据的大小。确保表之间保持一致。更小 --> 更容易缓存 --> 更快。​​
  • 您是否在其他地方使用id?您也许可以摆脱它,并将 UNIQUE 键升级为 PRIMARY KEY(student_id, exam_id)。这将使任何涉及 WHERE Student_id = Constant 的查询运行得更快。
  • 有一个 2 字节数据类型 YEAR
  • created_at 有什么用途吗? (闻起来像是某些框架提供的东西。)

关于mysql - 如何在rails中进行mysql表分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48986490/

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