我正在研究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中进行表分区,因为我希望这是唯一的解决方案。可能吗?如果是,如何在现有表上执行此操作而不会丢失数据并影响代码。
PARTITIONing
很少有助于表现。为了帮助您,我们必须看到缓慢的查询。也许有些人可能有所帮助。
同时,还有其他一些可能会提高性能的因素。
INT
和student_id
使用4字节的exam_id
。选择较小的数据类型,例如2字节的SMALLINT UNSIGNED
(范围为0..65535),会缩小数据的大小。确保表之间保持一致。更小 - >更可缓存 - >更快。id
吗?你可以摆脱它,而是将UNIQUE
关键字推广到PRIMARY KEY(student_id, exam_id)
。这将使涉及WHERE student_id = constant
的任何查询运行得更快。YEAR
。created_at
用于什么吗? (它闻起来像某些框架提供的东西。)