我看到这种格式从多个表中选择多个条件并且我已经实现了多年。我想知道的是,如果我们有任何办法可以让它更快。 查询的背景:我正在从消息表中选择来自学生和导师的消息,以查找学生在作业表中发布的作业。 导师的信息存储在tutorinfo表中,studentinfo存储在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
答案 0 :(得分:1)
这是您用更现代风格编写的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'
答案 1 :(得分:1)
使用MySQL JOINS
SELECT
jobs.`id` AS jobs_id,
jobs.`job_title` AS jobs_job_title,
messages.`id` AS messages_id,
messages.`job_id` AS messages_job_id,
messages.`thread_id` AS messages_thread_id,
messages.`tutor_id` AS messages_tutor_id,
messages.`student_id` AS messages_student_id,
tutorinfo.`id` AS tutorinfo_id
FROM
`messages` messages INNER JOIN `tutorinfo` tutorinfo ON messages.`tutor_id` = tutorinfo.`id`
INNER JOIN `jobs` jobs ON messages.`job_id` = jobs.`id` WHERE jobs.student_id = '3' AND messages.thread_id = '2'
另外看看这些东西
答案 2 :(得分:0)
这将成为补充@ Hogan答案的评论,但我是单独发布的。在Mysql JOIN
中,INNER JOIN
和CROSS JOIN
都是合成等价物。在没有连接条件的情况下,,
和INNER JOIN
在语义上是等效的,但,
的优先级较低。
在原始查询中,连接条件已放在where子句中。 Mysql查询优化器可能会为当前查询提供优化的查询计划,并通过在优化的顺序中使用INNER JOINS
来避免对产品进行交叉连接和过滤。但是,通过略微重写,您可以使连接条件显式,强制读取顺序并减少查询优化器需要执行的工作。也许这是可以忽略不计的性能优势。你必须剖析才能看到。
SELECT m.*,
t.id as tutor_id,
j.student_id as student_id, j.job_title
from messages m
STRAIGHT_JOIN jobs j on m.job_id = j.job_id and j.student_id = '3'
STRAIGHT_JOIN tutorinfo t on m.tutor_id = t.id
where m.thread_id = '2'
STRAIGHT_JOIN
与JOIN
类似,但左侧表格在右侧之前读取。来自Mysql documentation:
连接优化器计算表的顺序 加入。由LEFT JOIN或STRAIGHT_JOIN强制执行的表读取顺序 帮助连接优化器更快地完成其工作,因为那里 要检查的表排列更少