MYSQL 多表连接查询优化U

标签 mysql sql join

我有4张 table

类(class)、考试、问题、答案、用户响应

Class -> ID , Name
Exam -> ID,Name,Class_ID_FK
Questions -> ID,Question,Exam_ID,FK
Answers -> ID,Answer,Question_ID_Fk
UserResponses -> ID,UserID,Answer_ID_fk,Question_ID_fk

我想获取给定类(class)的所有考试的所有用户休息。我已经编写了一个查询,但我想看看其他人的建议以及我是否朝着正确的方向前进,因为这个查询的 500 个实例可能正在运行同时我的系统。

select r.answer_id_fk,r.userid,q.question,a.answer,e.name,e.class_id_fk
from  Exams e 
join Questions q on q.exam_id_fk = e.id  
join Answers a on a.question_id_fk = q.id 
left join UserResponses r on r.answer_id_fk = a.id
where  e.class_id_fk =105585;

我认为这最终会遍历数据库中的所有行,最终可能会崩溃。

解释说明了这一点。它返回 35 行是正确的。问题表中有 18091 行。响应中有 20423 行。答案中有“67108”。

1, SIMPLE, a, ALL, , , , , 67108, 
1, SIMPLE, q, eq_ref, PRIMARY, PRIMARY, 25, db_qa_dev.a.question_id_fk, 1, 
1, SIMPLE, c, eq_ref, PRIMARY, PRIMARY, 25, db_qa_dev.q.category_id_fk, 1, Using where
1, SIMPLE, r, ref, ANSWERID_INDEX, ANSWERID_INDEX, 26, db_qa_dev.a.id, 15, Using index

最佳答案

解释计划出现的方式,看起来您的外键索引之一丢失了。 MySQL 引擎应该寻找最佳查询计划,这通常意味着从索引上过滤最多的数据开始,然后从那里开始工作。我不知道实际数据看起来如何,但我猜 e.class_id_fk 上的约束应该非常严格,因此引擎可能会从过滤掉这些行开始。然后,由于您的 JOIN 都涉及简单的 FK/PK 关系,它只会连接其他表中的那些单行。

我能想到为什么它可能不这样做的唯一原因是因为你的一个表中的数据真的很奇怪(例如,Exam 中的每一行都有相同的class_id_fk 值)或者您的 FK 列之一缺少索引。

在 FK 列上缺少索引可能会使优化器决定采用不同的路线比必须为每个 JOIN 扫描该表更快。在大多数情况下,您总是希望对所有 FK 建立索引,因为您会经常在这些列上JOIN,因此索引对于读取非常有用。

关于MYSQL 多表连接查询优化U,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7768712/

相关文章:

mysql - 计算具有三个表的新列

mysql - 无法在 mysql-workbench 上添加外键约束

mysql - Docker:无法启动mysql

mysql - SQL - 分组依据 - 具有 - 缺失行

sql - 我如何在 Postgres 中优化这个 SQL 查询?

php - MySQL JOIN 一个表或另一个表

java - 如何在 Hibernate 中执行这样的查询?加入

python - 从远程数据库获取 UTF8 字符串

php - 从php查询数据库

mysql - mysql的最佳查询