小编Chr*_*ens的帖子

多表选择与JOIN(性能)

从MySQL中的多个表中进行选择时,以下两个查询都返回相同的结果集.

其中一个查询比另一个查询更好还是更有效?从我对小数据集的测试(每个表中约2k行),它们都在大约相同的执行时间内返回相同的结果集.

查询1:

SELECT
    *
FROM
    products,
    product_meta,
    sales_rights
WHERE 
    (
        products.id = product_meta.product_id
        AND products.id = sales_rights.product_id
    )
    AND (...)
LIMIT 0,10;
Run Code Online (Sandbox Code Playgroud)


查询2:

SELECT
    *
FROM
    products
INNER JOIN product_meta ON products.id = product_meta.product_id
JOIN sales_rights ON product_meta.product_id = sales_rights.product_id 
WHERE
    (...)
LIMIT 0,10;
Run Code Online (Sandbox Code Playgroud)

mysql

34
推荐指数
1
解决办法
4万
查看次数

用于活动流的智能MySQL GROUP BY

我正在为我们的网站构建一个活动流,并且已经取得了相当不错的进展.

它由两个表提供支持:

:

  • id - 唯一的流项目ID
  • user_id - 创建流项目的用户的ID
  • object_type - 对象类型(当前为'卖方'或'产品')
  • object_id - 对象的内部ID(当前是卖家ID或产品ID)
  • action_name - 针对对象采取的行动(目前是'买'或'心')
  • stream_date - 创建操作的时间戳.
  • hidden - 用户是否已选择隐藏项目的布尔值.

如下:

  • id - 独特的关注ID
  • user_id - 启动"关注"操作的用户的ID.
  • following_user - 正在关注的用户的ID.
  • followed - 执行跟随操作的时间戳.

目前我正在使用以下查询从数据库中提取内容:

查询:

SELECT stream.*,
   COUNT(stream.id) AS rows_in_group,
   GROUP_CONCAT(stream.id) AS in_collection
FROM stream
INNER JOIN follows ON stream.user_id = follows.following_user
WHERE follows.user_id = '1'
  AND stream.hidden = '0'
GROUP BY stream.user_id,
     stream.action_name,
     stream.object_type,
     date(stream.stream_date)
ORDER BY stream.stream_date DESC;
Run Code Online (Sandbox Code Playgroud)

这个查询实际上运行得很好,并且使用一点点PHP来解析MySQL返回的数据我们可以创建一个很好的活动流,如果行为之间的时间不是太大,同一个用户被分组在一起的行为相同(见下面的例子).

当前流输出示例

我的问题是,我如何让这更聪明?目前,它通过一个轴"用户"活动进行分组,当特定用户在特定时间范围内有多个项目时,MySQL知道将它们分组.

我怎样才能使这个更智能,并按另一个轴分组,例如"object_id",所以如果同一个对象按顺序有多个动作,则这些项被分组,但保持我们当前用于按用户分组动作/对象的分组逻辑.并实现这一点,没有数据重复?

按顺序出现的多个对象的示例: …

php mysql social-networking

28
推荐指数
4
解决办法
2600
查看次数

标签 统计

mysql ×2

php ×1

social-networking ×1