1

我有一个“学生”表,一个“班级”表,还有一个连接表,可以告诉哪些学生有哪些班级。我想获取某个学生的课程列表。我想按类的名称对该列表进行排序。

我的问题是 MySQL 在执行我的查询时会创建一个临时表。我认为这就是这个查询比没有“order by”子句的相同查询运行得慢得多的原因。

实际上,在我们的服务器上,我们的表有不同的名称,我们的联结表有超过 1000 万行。查询返回数千行。我们服务器的很大一部分负载来自该单个查询。

SELECT classes.* FROM classes
INNER JOIN students_classes
ON classes.id = students_classes.class_id
WHERE students_classes.student_id = 2
ORDER BY classes.name

MySQL 解释给出以下输出:

'id' => 1, 'select_type' => 'SIMPLE', 'table' => 'students_classes', 'type' => 'ref', 'possible_keys' => 'PRIMARY,student,class', 'key' => 'student', 'key_len' => '4', 'ref' => 'const', 'rows' => 2, 'Extra' => '使用索引;使用临时的;使用文件排序'

'id' => 1, 'select_type' => 'SIMPLE', 'table' => 'classes', 'type' => 'eq_ref', 'possible_keys' => 'PRIMARY', 'key' => 'PRIMARY ', 'key_len' => '4', 'ref' => 'students_classes.class_id', 'rows' => 1, 'Extra' => NULL,

如果我删除 'ORDER BY' 子句,mySQL 不会创建临时表。

CREATE TABLE `classes` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`),
INDEX `name` (`name`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPACT
AUTO_INCREMENT=506374;

CREATE TABLE `students_classes` (
`student_id` INT(11) NOT NULL,
`class_id` INT(11) NOT NULL,
PRIMARY KEY (`student_id`, `class_id`),
INDEX `student` (`student_id`),
INDEX `class` (`class_id`),
CONSTRAINT `class_id` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`),
CONSTRAINT `student_id` FOREIGN KEY (`student_id`) REFERENCES `students` (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

我没有包含学生表的创建代码,因为该表在查询中没有任何作用。

MySQL 版本是 5.5.35。

如何使该查询运行得更快?

4

0 回答 0