我有一张包含数千种产品和50个左右经过身份验证的用户的表格。
这些用户都在自己的网站上展示产品,他们都需要能够以不同的方式订购产品。
我猜我需要一些包含product_id,user_id和order列的订单的单独表格?
如何在mysql中最有效地执行此操作以便非常快速,并且如果我在数据库中获得数百万个产品,则不会减慢速度。
在mysql中执行它是否明智,或者我应该使用某种其他索引,如solr / lucene?
我的产品表称为“产品” 我的用户表称为“用户”
我需要的功能的一个很好的例子是谷歌搜索,如果您已登录,您可以在其中订购/扣押结果。
编辑:产品结果将被分页,用户有权编辑产品,因此它不仅仅是准备就绪
答案 0 :(得分:1)
嗯,首先,如果你在一个页面上显示数千个产品并最终产生数百万个产品,那就会很慢。我假设你以某种方式将它们过滤到每页一个合理的数字。
无论如何,你对product_order表的连接速度相当快:它在主键和常量(用户id)上,都是整数,它将是一个快速的索引查找。我可以看到一些问题。首先,每个用户是否真的要定义一百万种产品的订购?假设没有订单=最后显示,还有另一个问题:
SELECT whatever
FROM
products p
LEFT JOIN products_order o ON (
p.product_id = o.product_id
AND 1234 = o.user_id
)
WHERE p.stock > 0 -- some search criteria
ORDER BY COALESCE(o.order, 999999999) --- arbitrarily large number
LIMIT 10
ORDER BY
发生在LIMIT
之前。 MySQL必须加入每个行,然后对那个巨大的连接进行排序(hello filesort)。然后它从1,000,000行中抛出999,990。
如果事实证明每个人只销售一些产品,那么这个问题就不会发生:where子句将只有MySQL加入并排序几行。如果每个人卖出数百万,你可能不得不做一些非规范化,这样你就可以在products_order
中执行所有过滤,这也可以避免大量的行。你需要products_order
中的很多行,每个行(产品,用户)组合一个......不幸的是,无论哪种方式,你都会看到疼痛。
答案 1 :(得分:0)
您应该始终在where / order / group中索引发生的colums,以提高性能。但是在您的情况下,它实际上取决于层结构,客户如何访问您的数据库?
直接访问MySQL数据库,以便他们能够执行查询?
或者他们是通过Web服务等访问的?
无论哪种方式,我都会调整数据层,以便客户可以根据订单声明进行调整,从而提高客户的工作效率。
答案 2 :(得分:0)
您是否可以使用保存每个用户选项的表格。有一个“索引机器人”系统?这样你的SQL查询会更快。如果用户只关心他或她选择的有价值的前25个,为什么还要回到10万行?