我在某处看到了这种从具有多个条件的多个表中进行选择的格式,并且我已经实现了很多年。我想知道的是,是否有任何方法可以让它更快。 查询背景:我正在从消息表 b/w student 和 tutors 中为学生在 jobs 表中发布的工作选择消息。 导师信息存储在tutorinfo表中,学生信息存储在studentinfo表中。
请同时说明这是什么类型的连接。有人告诉我这是交叉连接,但我不确定。直到最近我才知道加入,但从来没有必要。这种格式已经为我服务了一段时间。我不确定使用连接格式如何让它变得更好,如果有的话。
这是当前查询::
SELECT
messages.* ,
tutorinfo.id as tutor_id,
jobs.student_id as student_id, jobs.job_title
from messages, tutorinfo, studentinfo, jobs where
messages.job_id= jobs.id and jobs.student_id = '3' and messages.thread_id = '2' and messages.tutor_id = tutorinfo.id and messages.job_id = jobs.id and studentinfo.id=jobs.student_id
最佳答案
这是以更现代的风格编写的 select 语句。在这种样式中,您可以看到连接(注意它们都是内部连接)。您可以看出它们是内部联接(在我们的两个查询中),因为联接的列是由相等的联接的。在使用交叉连接或外部连接的方法中,您需要特殊的格式(而不仅仅是 =
),您使用特殊语法的“连接”格式。
SELECT m.*,
t.id as tutor_id,
j.student_id as student_id, j.job_title
from messages m
join jobs j on m.job_id = j.job_id
join studentinfo s on j.student_id = s.id
join tutorinfo t on m.tutor_id = t.id
where j.student_id = '3' and m.thread_id = '2'
有一件事很清楚——studentinfo 未被使用,您可以将其删除。 除此之外,向所有用作连接的列添加索引,我没有看到太多优化方式。
SELECT m.*,
t.id as tutor_id,
j.student_id as student_id, j.job_title
from messages m
join jobs j on m.job_id = j.job_id
join tutorinfo t on m.tutor_id = t.id
where j.student_id = '3' and m.thread_id = '2'
关于mysql - 在 mysql 中连接 4 个或更多表的更快查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17387308/