Mysql 如何使用隐私设置选择数据?

Mysql 如何使用隐私设置选择数据?,mysql,Mysql,有一些事件。事件可以是私有的-只有受邀请的用户才能看到它,公共的-对所有人可见,在组中-只有组成员才能看到它。组可以是公共的,也可以是私有的。我们不应该展示私人团体的活动 event id, title, group (nullable), is_private event_invitee event_id, user_id group id, title, is_open group_participant group_id, user_id 现在,为了显示当前经过身份验证的用户可用的

有一些事件。事件可以是私有的-只有受邀请的用户才能看到它,公共的-对所有人可见,在组中-只有组成员才能看到它。组可以是公共的,也可以是私有的。我们不应该展示私人团体的活动

event
id, title, group (nullable), is_private

event_invitee
event_id, user_id

group
id, title, is_open

group_participant
group_id, user_id
现在,为了显示当前经过身份验证的用户可用的事件,我们执行类似(伪代码)的查询:


这是一个很好的方法,但非常缓慢。而且没有可能使它过时。如何改变结构以更快地获得结果和可伸缩性?

为了加快速度:您必须将“左连接”重写为“where子句”。这说起来容易做起来难。但是,首先应用删除最多记录的过滤器会给您带来好处。假设一个位置中只有10个事件,并且选择了位置筛选器,那么查询不必筛选不在该位置的私有、公共或组事件。我知道说这很容易,但除非我有一些数据,否则没有真正的代码可以呈现。我希望这为你指明了正确的方向。我设法将一个持续超过30秒的查询速度提高到1秒多一点。最后,我们忘了为生产数据库编写索引脚本。因此,您还可以添加一些位置合适的索引以加快速度。

您应该计算出实际的查询,了解索引使用情况和可能的优化,而不是伪代码。到目前为止,您在优化MySQL服务器和查询方面做了哪些尝试?@njk这是伪代码。@Stennie IMHO此任务不应由MySQL完成,而应由Sphinx或MongoDB完成,没有此连接。连接不一定是坏的。。您没有提供足够的信息来理解为什么查询实际上很慢。您在MySQL中使用的存储引擎是什么?你要加入多少行?解释是什么样子的?您可能错过了MySQL中一些明显的调整,而转向另一个产品并不是一个灵丹妙药。您还可以通过对数据进行非规范化来删除MySQL中的一些连接。有了大量需要索引的搜索条件选择,您可能会更好地使用Sphinx或Lucene等搜索引擎,但可能会有更简单的优化,如调优或缓存<代码>左连接到何处?你的意思是恢复旧的/坏的
选择。。。从表1、表2、表3,。。。哪里…
语法-1对于不可理解(和糟糕)的建议。
SELECT
  e
FROM event e
  LEFT JOIN e.invitees i WITH i.user = :current_user # is current user invited to event ?
  LEFT JOIN e.group g
  LEFT JOIN g.participants p WITH g.user = :current_user # is current user are participant of group?
WHERE ((e.group IS NULL OR g.is_open = true OR (g.is_open = false AND p IS NOT NULL))
  AND (r.is_private = false OR (r.is_private = true AND i IS NOT NULL)))
  AND /* other filters, like by location */