如何加快产品搜索查询
How to speedup product search queries
在我的系统中,我在 table products(id, price, name) 中有 1 000 000 条记录,每个分类组有 ~12 000 个产品 - table groups(group_id, product_id).
我想要按 price/name/id/whatever 排序的组中的产品。加入本身需要 300 毫秒,然后在接下来的 200 次排序(文件排序),所以我已经失去了 500 毫秒只是为了排序东西,而不是加入其他 30 tables 来获取业务数据。
我想知道其他公司有多大处理它,例如我可以在亚马逊上按价格排序显示 12 000 页。我的竞争对手的网站可以在不到 150 毫秒的时间内显示 1158 个页面(第一次点击也是 150 毫秒)。目录是否有 30 个产品或 300 000 个都没有关系。
我应该使用什么技巧和技术来达到这样的速度?
我已经有了所有可能的索引,调整缓冲区大小也无济于事。
示例查询:
SELECT products.id
FROM products
JOIN groups ON products.id = groups.product_id
WHERE groups.group_id = '123'
ORDER BY products.price DESC
limit 10000, 100;
<rant>
有几千页要翻,真是可怜UI。最好要求用户在下降到 small 数量的 'pages' 之前进行一些过滤。</rant>
回到你的问题...
如果 group_id
和 price
在 相同的 table 中,简单的答案是添加复合 INDEX(group_id, price)
.这样,优化器可以过滤 group_id
and 扫描 price
and 进入 LIMIT
.
没有它,最好的办法是找到所有带有 group_id = 123
的行,找到它们的所有价格,对温度 table 进行排序,然后才查看 LIMIT
.注意 "all".
但是... OFFSET
本身就是 任一 情况下的杀手。在到达您想要的 10 行之前,执行必须超过 10000 行。这个问题我有解决方案。记住where you left off。 (但是,我再说一遍,这不能用 WHERE
和 ORDER BY
分成两个 table 来完成。)
在我的系统中,我在 table products(id, price, name) 中有 1 000 000 条记录,每个分类组有 ~12 000 个产品 - table groups(group_id, product_id).
我想要按 price/name/id/whatever 排序的组中的产品。加入本身需要 300 毫秒,然后在接下来的 200 次排序(文件排序),所以我已经失去了 500 毫秒只是为了排序东西,而不是加入其他 30 tables 来获取业务数据。
我想知道其他公司有多大处理它,例如我可以在亚马逊上按价格排序显示 12 000 页。我的竞争对手的网站可以在不到 150 毫秒的时间内显示 1158 个页面(第一次点击也是 150 毫秒)。目录是否有 30 个产品或 300 000 个都没有关系。
我应该使用什么技巧和技术来达到这样的速度?
我已经有了所有可能的索引,调整缓冲区大小也无济于事。 示例查询:
SELECT products.id
FROM products
JOIN groups ON products.id = groups.product_id
WHERE groups.group_id = '123'
ORDER BY products.price DESC
limit 10000, 100;
<rant>
有几千页要翻,真是可怜UI。最好要求用户在下降到 small 数量的 'pages' 之前进行一些过滤。</rant>
回到你的问题...
如果 group_id
和 price
在 相同的 table 中,简单的答案是添加复合 INDEX(group_id, price)
.这样,优化器可以过滤 group_id
and 扫描 price
and 进入 LIMIT
.
没有它,最好的办法是找到所有带有 group_id = 123
的行,找到它们的所有价格,对温度 table 进行排序,然后才查看 LIMIT
.注意 "all".
但是... OFFSET
本身就是 任一 情况下的杀手。在到达您想要的 10 行之前,执行必须超过 10000 行。这个问题我有解决方案。记住where you left off。 (但是,我再说一遍,这不能用 WHERE
和 ORDER BY
分成两个 table 来完成。)