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

问题描述 投票:0回答:1

我正在研究Rails web-framework,它有一个mysql table exam_scores,有3500万条记录(可能会在两年内加倍!)。 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中进行表分区,因为我希望这是唯一的解决方案。可能吗?如果是,如何在现有表上执行此操作而不会丢失数据并影响代码。

mysql ruby-on-rails query-performance
1个回答
0
投票

PARTITIONing很少有助于表现。为了帮助您,我们必须看到缓慢的查询。也许有些人可能有所帮助。

同时,还有其他一些可能会提高性能的因素。

  • 你有数十亿学生吗?你可能不需要为INTstudent_id使用4字节的exam_id。选择较小的数据类型,例如2字节的SMALLINT UNSIGNED(范围为0..65535),会缩小数据的大小。确保表之间保持一致。更小 - >更可缓存 - >更快。
  • 你在其他地方使用id吗?你可以摆脱它,而是将UNIQUE关键字推广到PRIMARY KEY(student_id, exam_id)。这将使涉及WHERE student_id = constant的任何查询运行得更快。
  • 有一个2字节的数据类型YEAR
  • created_at用于什么吗? (它闻起来像某些框架提供的东西。)
© www.soinside.com 2019 - 2024. All rights reserved.