感谢您的关注。
整夜努力,但没有结果。
我对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中没有使用任何键。

我在这里放了屏幕截图=

mysql - 如何优化此sqlrq?合适吗怎么做更好?-LMLPHP



接下来是数据库的想法。
任何用户都可以发布任意数量的项目,
每个项目可能都有其图片(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..etc。

proj1 - user1 - 3 photos
proj2 - user1 - 2 photos
proj3 - user2 - 1 photo
proj4 - user1 -  no photos
proj5 - user1 - 2 photos
etc


table_files是在下一个逻辑中构建的:

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

最佳答案

我们不可能知道这是否是“优化的”,因为这需要了解的知识比您告诉我们的更多。以后再说。

尽管MySQL确实允许使用反引号来标识,但并非必须使用,除非标识包含空格或为保留字。必要的是在列名之前添加表名或使用表别名。强烈建议这样做(即“最佳做法”),以便您始终知道列来自哪个表。注意,我不得不GUESS在下面的所有联接中使用哪个表别名,它们可能需要更正。

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 Optimizing Queries with EXPLAIN

如果缺少索引,请考虑将其添加到说明标识的表中。

关于mysql - 如何优化此sqlrq?合适吗怎么做更好?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54084903/

10-10 08:30
查看更多