编译要排除的 MySQL 行列表时:预编译还是不预编译?

Posted

技术标签:

【中文标题】编译要排除的 MySQL 行列表时:预编译还是不预编译?【英文标题】:When compiling a list of MySQL rows to exclude: to Pre-Compile or not to Pre-Compile? 【发布时间】:2012-10-03 16:19:09 【问题描述】:

在我的一个 php 网站上,我需要让我的用户能够选择某些行以从网站上的所有搜索结果(查询)中排除。

我应该以哪种方式处理排除项,我应该:

1) 每当用户登录(或更新)时,通过查询预编译排除行列表,将列表保存在 Session 变量中,然后简单地将 $query .= " AND userid NOT IN ($_SESSION['ExclusionList'])" 添加到网站上的每个搜索查询中,

2) 只需将$query .= " AND userid NOT IN (SELECT userid FROM Excluded WHERE excludedBy = '$currentUserID')" 添加到网站上的每个搜索查询,就可以直接在每个查询中即时编译它?

方法 1) 似乎更有效,因为我只在用户登录时(或每当他们更新它时)编译列表一次,而不是每次任何用户在网站上运行搜索查询时都必须编译列表.

你有什么建议,为什么?

【问题讨论】:

始终非常小心地正确转义插入到 SQL 查询中的 anyall 值以避免SQL injection bugs。 【参考方案1】:

从技术上讲,这将被称为“缓存”这些值,如果列表不会变得太大,或者您的 $_SESSION 最终可能会有点重量级,这不是一个坏主意。

进行子选择可能非常昂贵,尤其是在大量记录上,因此通常最好将其缓存。

【讨论】:

感谢您确认我的信念。现在,对于会话变量,您认为什么“太大”?例如,包含 500 个数字的列表会“太大”吗?对于 $_SESSION 来说,在什么时候它变得“太大”,而进行子选择变得更有价值?谢谢。 好吧,考虑到您必须为每个请求加载此会话,这有点主观。 4KB 的数据通常是可以的,这可能转化为大约 580 个 6 位数字,包括逗号。如果这个列表不太可能变得那么大,你应该没问题。如果这是针对某种忽略系统,请记住,大多数用户只会忽略少数人,但有些人是真正的仇恨者,并且会积极地忽略。

以上是关于编译要排除的 MySQL 行列表时:预编译还是不预编译?的主要内容,如果未能解决你的问题,请参考以下文章

cmake 预编译

MySQL的预编译入门

MySQL的预编译入门

预编译命令行由啥符号开头?

PHP-Mysqli扩展库的预编译

我需要在生产模式下运行预编译吗?还是为我做的(播放框架 1.2.6)