微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mysql – 具有等式[A],范围[B],分组依据[C]和按[count(P)]顺序查询的最佳索引策略

我的查询效果不佳:

SELECT  user_id, count(item_id) as count
FROM table items 
WHERE category = 'magazine'
AND created_at > 1384754400
GROUP BY user_id
ORDER BY count(item_id) desc
LIMIT 100

什么是最佳索引策略以优化此查询

表详细信息

5亿条记录,具有以下结构/基数:

> PRIMARY KEY(item_id) – 基数:500 M.
> user_id – 基数:~25 M.
>类别 – 基数:~2.5 M
> created_at – 基数:~150 M.

索引:

>我在user_id,category和created_at字段中都有各自的索引

我还有以下覆盖索引:

>(category,user_id) – 这是查询优化器在运行explain时认的那个
>(category,created_at)
>(category,created_at,user_id) – 我试图创建这个以优化此查询,但是,它似乎不能很好地工作.

解决方法:

如果您只想针对此查询进行优化.这是最好的指数:

ALTER TABLE items ADD INDEX (category, created_at, user_id)

这样可以优化过滤器的值,从而减少您触摸的数据总量.通过在查询末尾添加user_id,item_id,可以使索引覆盖,并且可以节省对主索引的查找.

我们可以假设item_id是NOT NULL(因为它是PRIMARY索引).

但是,因为MysqL优化器非常愚蠢,您可能需要像这样重写:

SELECT  user_id, SUM(count) AS count
FROM
(
  SELECT category, created_at, user_id, COUNT(*) as count
  FROM items
  WHERE category = 'magazine'
  AND created_at > 1384754400
  GROUP BY category, created_at, user_id
) AS d
GROUP BY user_id
ORDER BY count DESC
LIMIT 100

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐