在mysql中连接4个或更多表的更快查询

在mysql中连接4个或更多表的更快查询,mysql,Mysql,我在某处看到了这种从多个表中选择多个条件的格式,并且我已经实现了很多年。我想知道的是我们是否有办法让它更快。 查询背景:我正在从消息表b/w学生和导师中选择消息,以获取学生在作业表中发布的作业。 导师信息存储在tutorinfo表中,studentinfo存储在studentinfo表中 请告诉我这是什么样的加入。有人告诉我这是交叉连接,但我不确定。我直到最近才知道加入,但从来没有必要。这种格式已经为我服务了很长一段时间了。我不知道如何使用连接格式将使它更好,如果有的话 以下是当前查询:: SE

我在某处看到了这种从多个表中选择多个条件的格式,并且我已经实现了很多年。我想知道的是我们是否有办法让它更快。 查询背景:我正在从消息表b/w学生和导师中选择消息,以获取学生在作业表中发布的作业。 导师信息存储在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 

这是你用更现代的风格写的select语句。在该样式中,您可以看到连接注意它们都是内部连接。在我们的两个查询中都可以看出它们是内部联接,因为在上联接的列由相等的列联接。在要使用交叉联接或外部联接的方法中,需要使用特殊的格式,而不仅仅是a=,而联接格式使用特殊的语法

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' 
有一件事很清楚——学生信息没有被使用,你可以去掉它。 除此之外,向用作联接的所有列添加索引,我看不到太多的优化方法

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连接

再看看这些东西


这将是对@Hogan回答的补充,但我将单独发布。在Mysql连接中,内部连接和交叉连接都是同步的等价物,在没有连接条件的情况下,内部连接在语义上是等价的,但优先级较低

在原始查询中,连接条件已放置在where子句中。Mysql查询优化程序可能会为当前查询提供一个优化的查询计划,并通过以优化的顺序使用内部连接来避免交叉连接和对产品进行过滤。但是,通过稍微重写,可以使连接条件显式化,强制读取顺序并减少查询优化程序需要做的工作。也许这对性能有不可忽视的好处。你必须要有个人资料才能看到

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'
直线连接与连接类似,但左表先于右表读取。从Mysql:

联接优化器计算表的排列顺序 加入。表的读取顺序由左联接或直联接强制执行 帮助联接优化器更快地完成其工作,因为 要检查的表排列较少


试着养成使用显式连接语法的习惯。它对您、我们以及在某些情况下对MySQL都更具可读性。而且,正如其他人所指出的,不要包含与你的结果集无关的表格。你为什么要加入studentinfo?它从未被使用过。抱歉@Hogan,因为user1849091提到了studentinfo表……这就是我加入该表的原因……请参阅我的更新。。。。。
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'