Mysql结果按列表排序,每个用户都是唯一的

我有一个包含数千种产品和50个左右经过身份validation的用户的表。

这些用户都在自己的网站上展示产品,他们都需要能够以不同的方式订购产品。

我猜我需要一些包含product_id,user_id和order列的订单的单独表格?

我如何在mysql中最有效地执行此操作以便非常快速,并且如果我在数据库中获得数百万个产品,则不会减慢速度。

在mysql中执行它是否明智,或者我应该使用某种其他索引,如solr / lucene?

我的产品表称为“产品”我的用户表称为“用户”

我需要的function的一个很好的例子是谷歌搜索,如果您已登录,您可以在其中订购/抑制结果。

编辑:产品结果将被分页,用户有权编辑产品,因此它不仅仅是准备好的

嗯,首先,如果你在一个页面上显示数千个产品并最终产生数百万个产品,那将会很慢。 我假设你以某种方式将它们过滤到每页一个合理的数字。

无论如何,你对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。

如果事实certificate每个人只销售一些产品,那么这个问题就不会发生:where子句只允许MySQL加入并排序几行。 如果每个人卖出数百万,你可能不得不做一些非规范化,这样你就可以在products_order执行所有过滤,这也可以避免大量的行。 你会在products_order需要很多行,每个(产品,用户)组合一个……不幸的是,无论哪种方式,你都会看到痛苦。

您应该始终在where / order / group中索引出现的colums以提高性能。 但是在您的情况下,它实际上取决于层结构,客户如何访问您的数据库?

直接到MySQL数据库,以便他们有能力执行查询?

或者他们是通过Web服务等访问的?

无论哪种方式,我都会调整数据层,以便客户可以根据订单声明进行调整,从而提高客户的工作效率。

你不能使用一个表,你将保存每个用户选项。 有一个“索引机器人”系统? 这样你的SQL查询会更快。 如果用户只关心他或她选择的前25名,那么为什么还要回到10万行呢?