首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优化这个sqlrq?这合适吗?如何做得更好?

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

Stack Overflow用户
提问于 2019-01-08 03:38:47
回答 1查看 14关注 0票数 0

感谢您的关注。一整晚都在努力,但没有结果。我对mySQL很陌生。

请告诉我,它是否经过适当的构造和优化:

代码语言:javascript
复制
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_projects使用任何键。

我把截图放那儿了

下一个是数据库的概念。任何用户都可以发布任意数量的项目,每个项目都有自己的图片(0..x)

项目可能也有附加的文件。可能有1或部分或可能没有。

joint是下一个:项目innerjoin用户左转文件

我从这个rq得到了什么:

代码语言:javascript
复制
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。

代码语言:javascript
复制
proj1 - user1 - 3 photos
proj2 - user1 - 2 photos
proj3 - user2 - 1 photo
proj4 - user1 -  no photos
proj5 - user1 - 2 photos
etc

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

代码语言:javascript
复制
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.

例如

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2019-01-08 04:17:04

我们不可能知道这是否是“优化”的,因为这需要知道比你告诉我们的更多。稍后再讨论这个问题。

虽然MySQL确实允许在标识中使用backticks,但是除非标识包含一个空格或一个保留字,否则使用它并不是强制性的。所需要的是在列名前加上它们的表名,或者使用表别名。这是强烈建议的(即“最佳实践”),这样您就可以始终知道哪一列来自哪个表。注意,我必须猜测在下面的所有联接中使用哪个表别名,它们可能需要更正。

代码语言:javascript
复制
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优化查询

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54084903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档