谢谢你的关注。整夜尽我最大的努力却没有结果。我是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
我对它使用了explain,发现它没有对第一个表使用任何键 table_projects
.
我把截图放在那里=
接下来是数据库的概念。任何用户都可以发布任意数量的项目,每个项目都可以有自己的图片(0..x)
项目可能还有一个附加文件。可能有1个或一些或没有。
joint是下一个:项目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
在下一个逻辑中生成表\u文件:
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.
如
if (file_isWhatfor=_TheProject) AND (file_ResourceID=3) ->> to the proj#3
if (file_isWhatfor=_TheUserProfile) AND (file_ResourceID=3) ->> to the user#3
if (file_isWhatfor=_TheMessage) AND (file_ResourceID=3) ->> to the msg#3
1条答案
按热度按时间zphenhs41#
我们不可能知道这是否是“优化的”,因为这需要知道的比你告诉我们的更多。稍后再谈。
虽然mysql允许对标识使用backticks,但除非标识包含空格或是保留字,否则您不必使用backticks。必要的是在列名前面加上表名或使用表别名。强烈建议这样做(即“最佳实践”),以便您始终知道列来自哪个表。注意,我不得不猜测在下面的所有联接中使用哪个表别名,它们可能需要更正。
还请注意,您使用的所有括号都是完全多余的,可以安全地删除。
为了进一步“优化”,我建议您不要使用
select *
. 指定所需的列,这可以提高结果传输的速度,但不一定对查询执行有任何可测量的影响。除此之外,还需要在所有联接中涉及的所有列上都有索引,并且可以使用explain plan
. 请参见8.8.1使用explain优化查询如果缺少索引,请考虑将其添加到explain标识的表中。