Mysql 如何优化这个sqlrq?这合适吗?如何做得更好?

Mysql 如何优化这个sqlrq?这合适吗?如何做得更好?,mysql,optimization,left-join,inner-join,Mysql,Optimization,Left Join,Inner Join,谢谢你的关注。 整夜尽我最大的努力,但没有结果。 我是mySQL的新手 请告诉我 它是否正确构造和优化: SELECT * FROM ( (`tbl_projects` LEFT JOIN `tbl_files` ON ((`file_isforType` = 1) AND `file_isforID`=`proj_uid`) ) INNER JOIN `tbl_users` ON `proj_InitiatorUsrID` = `usr_UID` ) ORDER

谢谢你的关注。 整夜尽我最大的努力,但没有结果。 我是mySQL的新手

请告诉我 它是否正确构造和优化:

SELECT * 
FROM (
    (`tbl_projects` 
LEFT JOIN `tbl_files` 
    ON ((`file_isforType` = 1) AND `file_isforID`=`proj_uid`) )
INNER JOIN `tbl_users` 
    ON `proj_InitiatorUsrID` = `usr_UID` )
ORDER BY `file_uid` DESC LIMIT 0 , 15
我已经解释过了 并发现它没有为第一个table\u项目使用任何键

我在那里放了截图=

接下来是数据库的概念。 任何用户都可以发布任意数量的项目和 每个项目都可能有其图片0..x

项目也可能有一个附加文件。可能有1个或一些,也可能没有

下一步是: 项目innerjoin用户leftjoin文件

我通过这个rq得到了什么:

proj1 | user1 | photo1
proj1 | user1 | photo2
proj1 | user1 | photo3

proj2 | user1 | photo4
proj2 | user1 | photo5

proj3 | user2 | photo6

proj4 | user1 | null

proj5 | user1 | photo7
proj5 | user1 | photo8
proj6 | user2 | null
所以,从上到下一个一个地运行我的php脚本 项目的html列表中的表单。 有些人没有照片。有些人有一个。有些有2、3、4……等等

proj1 - user1 - 3 photos
proj2 - user1 - 2 photos
proj3 - user2 - 1 photo
proj4 - user1 -  no photos
proj5 - user1 - 2 photos
etc
表_文件是在下一个逻辑中生成的:

file_uid | file_ownerID | file_isforType| file_isforID
file_uid PRIMARY AI
file_ownerID  reference to PRIMARY at table_users
file_isforType- smallint 1..9
indicates type of THING which this file was attached to.
 eg
1 = _TheProject as project photo
2 = _TheUserProfile as users photo
3 = _TheMessage as attachment

file_ResourceID - unique id of that very thing, whose type specified in file_isforType.
乙二醇


我们不可能知道这是否是优化的,因为这需要知道的比您告诉我们的更多。稍后再谈

虽然MySQL允许对标识使用反勾号,但除非标识包含空格或是保留字,否则不强制使用反勾号。必要的是在列名前面加上表名或使用表别名。强烈建议您这样做,即最佳做法,以便您始终知道列来自哪个表。注意,我不得不猜测在下面的所有联接中使用哪个表别名,它们可能需要更正

SELECT 
       *
FROM   tbl_projects AS p
LEFT JOIN tbl_files AS f ON p.proj_uid = f.file_isforID AND f.file_isforType = 1
INNER JOIN tbl_users AS u ON p.proj_InitiatorUsrID = u.usr_UID
ORDER BY f.file_uid DESC 
LIMIT 0 , 15
还请注意,您使用的所有括号都是完全多余的,可以安全地删除

为了进一步优化,我建议您不要使用select*。指定所需的列,这可以提高结果传输的速度,但不一定对查询执行有任何可测量的影响。除此之外,您需要在所有联接中涉及的所有列上都有索引,并且您可以使用解释计划来研究是否缺少索引。看


如果有一个缺失的索引,考虑将其添加到解释解释的表中。

欢迎到堆栈溢出!在proj和use列上使用GROUP BY,在photo列上使用GROUP_CONCAT,将大大减少行数,并使PHP代码更简单。如果不知道每列在哪个表中,我们无法判断查询。请根据列来自哪个表来限定这些列。我看到了限制0,15-是否要分页?关于cource的最佳实践,您注意到每个字段名都有其父表的前缀,并且是唯一的。可以吗?可以。没关系。但是,如果使用自联接或需要对表进行多个联接,则列命名约定不再是解决方案。即使使用了列命名约定,仍然强烈建议您这样做。
SELECT 
       *
FROM   tbl_projects AS p
LEFT JOIN tbl_files AS f ON p.proj_uid = f.file_isforID AND f.file_isforType = 1
INNER JOIN tbl_users AS u ON p.proj_InitiatorUsrID = u.usr_UID
ORDER BY f.file_uid DESC 
LIMIT 0 , 15