MySQL连接表查询速度慢

时间:2017-03-16 18:07:42

标签: mysql database performance junction

我有一个'学生'表,a'班级' table和我有一个联结表,告诉哪些学生有哪些课程。我想获得某个学生的班级列表。我想按类的名称订购该列表。

我的问题是MySQL在执行我的查询时会创建一个临时表。而且我认为这就是为什么这个查询比没有'顺序的同一查询慢得多的原因。子句。

实际上在我们的服务器上,我们的表有不同的名称,我们的联结表有超过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,学生,班级','关键' => '学生',' key_len' => ' 4',' ref' => ' const','行' => 2,'额外' => '使用索引;使用临时;使用filesort'

' ID' => 1,' select_type' => ' SIMPLE',' table' => '班级','类型' => ' eq_ref',' possible_keys' => ' PRIMARY',' key' => ' PRIMARY',' key_len' => ' 4',' ref' => ' students_classes.class_id','行' => 1,'额外' => 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。

如何让查询运行得更快?

0 个答案:

没有答案