Joe*_*Joe 4 mysql sql database query-optimization
更新(根据每个人的回复):
我正在考虑改变我的结构,以便我有一个名为prx_tags_sportsitems的新表.我将完全删除prx_lists.prx_tags_sportsitems将作为ID表的引用来替换prx_lists.ListString,该prx_lists.ListString曾用于存储属于每个prx_sportsitem的标签的ID.
新关系将是这样的:
prx_tags将包含TagName.这样我仍然可以将每个"标签"维护为一个单独的唯一实体.
我查找所有标有"有氧"标签的sportsitems的新查询将类似于以下内容:
SELECT prx_sportsitems.* FROM prx_sportsitems, prx_tags_sportsitems
WHERE prx_tags_sportsitems.OwnerID = prx_sportsitems.ID
AND prx_tags_sportsitems.TagID = (SELECT ID FROM prx_tags WHERE TagName = 'aerobic')
ORDER BY prx_sportsitems.DateAdded DESC LIMIT 0,30;
Run Code Online (Sandbox Code Playgroud)
或许我可以用"IN"条款做点什么,但我还不确定.
在我对脚本进行这么大的修改之前,每个人都赞成吗?评论?非常感谢!
原始邮寄:
说到MYSQL查询,我很新手.当我最初设计我的数据库时,我做了一些相当愚蠢的事情,因为它是我能找到的唯一解决方案.现在我发现它似乎对我的MYSQL服务器造成了太大的压力,因为执行每个查询需要0.2秒,我相信如果它是一个更好的查询可能更像0.02秒(或表设计,如果它来吧!).我想避免需要重建我的整个网站结构,因为它的设计方式与目前的方式非常相似,所以我希望有更快的mysql查询.
我的数据库中有三个表:
每个体育项目都分配有多个标签名称(类别).每个"标签"都作为单独的结果存储在prx_tags中.我在prx_sportsitems中为体育项创建prx_lists中的"列表",并通过链接到prx_sportsitems.ID的prx_lists.OwnerID链接它们.
这是我当前的查询(查找所有标记为"有氧"的体育项目):
SELECT prx_sportsitems.*
FROM prx_sportsitems, prx_lists
WHERE prx_lists.ListString LIKE (CONCAT('%',(SELECT prx_tags.ID
FROM prx_tags
WHERE prx_tags.TagName = 'aerobic'
limit 0,1),'#%'))
AND prx_lists.ListType = 'Tags-SportsItems'
AND prx_lists.OwnerID = prx_sportsitems.ID
ORDER BY prx_sportsitems.DateAdded
DESC LIMIT 0,30
Run Code Online (Sandbox Code Playgroud)
为了帮助澄清更多信息,包含所有标记ID的列表位于名为ListString的单个字段中,我将其构造如下:"#1#2#3#4#5"......从中,上面的查询"concats"prx_tags.ID这个标记名是'有氧'.
我的想法是,可能没有更快的查询存在,我需要简单地接受我需要做一些更简单的事情,例如将所有标签放在列表中,直接放在prx_sportsitems中一个名为"TagsList"的新字段中,那么我可以简单地运行一个查询,它从prx_sportsitems做Select*,其中TagsList LIKE'%aerobic%' - 但是,我想避免重新设计我的整个网站.我真的后悔没有事先调查优化:(
每当我写一个查询,并且认为我需要使用时LIKE,我的头脑中就会发出一个警报,表示可能有更好的设计.这肯定是这种情况.
您需要重新设计prx_lists表格.从你所说的,很难说出确切的架构应该是什么,但这是我最好的猜测:
prx_lists应具有三列:OwnerID,ListType,和TagName.然后,对于OwnerID具有的每个标记,您将拥有一行.您的上述查询现在看起来像这样:
SELECT prx_sportsitems.*
FROM prx_sportsitems, prx_lists
where prx_lists.TagName = 'aerobic'
AND prx_lists.OwnerID = prx_sportsitems.ID
Run Code Online (Sandbox Code Playgroud)
这是一个更有效的查询.也许ListType不属于那个表,但很难说没有关于该列用于什么的更多信息.
不要忘记创建适当的索引!这将提高性能.
重构数据库模式可能会很痛苦,但在我看来,这是解决长期问题的唯一方法.
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |