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

wkftcu5l  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(319)

谢谢你的关注。整夜尽我最大的努力却没有结果。我是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
zphenhs4

zphenhs41#

我们不可能知道这是否是“优化的”,因为这需要知道的比你告诉我们的更多。稍后再谈。
虽然mysql允许对标识使用backticks,但除非标识包含空格或是保留字,否则您不必使用backticks。必要的是在列名前面加上表名或使用表别名。强烈建议这样做(即“最佳实践”),以便您始终知道列来自哪个表。注意,我不得不猜测在下面的所有联接中使用哪个表别名,它们可能需要更正。

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 * . 指定所需的列,这可以提高结果传输的速度,但不一定对查询执行有任何可测量的影响。除此之外,还需要在所有联接中涉及的所有列上都有索引,并且可以使用 explain plan . 请参见8.8.1使用explain优化查询
如果缺少索引,请考虑将其添加到explain标识的表中。

相关问题