【问题标题】:Best MySQL query for performance性能最佳的 MySQL 查询
【发布时间】:2012-04-27 16:24:04
【问题描述】:

我有这个 mysql 数据库,我需要在其中执行更大的 MySQL 查询。 用户 A 在名为 users 的表中有一行。在名为“trackers”的字段的值中,有一个逗号分隔的值,其中包含用户 A 收到通知的朋友的 id。

MySQL --> 用户(表)--> 跟踪器(字段)--> 2,3,4(值)。

MySQL 服务器必须在一次查询中用逗号分隔值。我认为如果服务器只执行一个查询而不是使用 PHP foreach 每个值执行一个查询,这对服务器会更友好。

我需要这样的查询:SELECT * FROM users WHERE in (SELECT trackers FROM users WHERE id = $me SEPERATED BY,)

【问题讨论】:

  • 不要吹毛求疵,但这是一个典型的例子,说明为什么不应该使用“csv 字段”而使用单独的表格...

标签: php mysql database


【解决方案1】:

我对此的感觉是,表格设计不适合您希望实现的目标。我个人的方法是将跟踪器分离到自己的表中。由于一个用户基本上是在跟踪另一个用户,因此该表将与用户表链接两次。

请参阅下面我建议的表格设计。

因此,此设计将允许您通过如下查询选择用户正在跟踪的所有用户:

SELECT users.* 
FROM trackers
INNER JOIN users ON id = tracker
WHERE user.id = {your user id}

【讨论】:

  • +1 user has_many user 通过 trackers。它基本上只是一个追随者/朋友表。
【解决方案2】:

我一直发现,对于像你这样的查询,做 2 个查询通常是最好的解决方案。

第一个:

SELECT trackers FROM users WHERE `user_id` = $me

然后是第二个,将第一个的结果内爆成:

SELECT * FROM users WHERE `id` IN (".implode(',',$results).")

不确定这是否是最佳解决方案,但根据我的经验,它对我工作的某些网站的页面加载时间产生了巨大影响。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2011-12-02
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 2017-03-24
    相关资源
    最近更新 更多