Mysql 如何优化这个sqlrq?这合适吗?如何做得更好?
谢谢你的关注。 整夜尽我最大的努力,但没有结果。 我是mySQL的新手 请告诉我 它是否正确构造和优化: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
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