一尘不染

MySQL“ in子句”中的项目数

mysql

我有三个表来定义用户:

USER: user_id (int), username (varchar)
USER_METADATA_FIELD: user_metadata_field_id (int), field_name (varchar)
USER_METADATA: user_metadata_field_id (int), user_id (int), field_value (varchar)

我想创建一个对应用程序中的其他用户具有一定访问权限的中间层用户。为了确定已登录的用户可以访问哪些用户,我使用了如下子查询:

SELECT user_id FROM user WHERE user_id 
     IN (SELECT user_id 
         FROM user_metadata 
         WHERE user_metadata_field_id = 1 AND field_value = 'foo')

当前,我将子查询字符串存储在变量中,然后每次需要拉出用户列表时,将其动态插入到外部查询中。完成此操作后,我想到“最好只存储实际user_ids
的字符串”。

因此,与其将其存储在变量中…

$subSql = "SELECT user_id FROM user_metadata WHERE user_metadata_field_id = 1 AND field_value = 'foo'";

…我实际上是执行查询并以这种方式存储结果…

$subSql = "12, 56, 89, 100, 1234, 890";

然后,当我需要拉一小部分登录用户有权访问的用户时,可以使用以下方法:

$sql = "SELECT user_id FROM user WHERE user_id IN ($subSql)";

最后是问题:

MySQL INCLAUSE中可以使用多少个项目?每次执行该外部查询时,必须存储实际的id而不是sub-sql语句,对吗?


阅读 191

收藏
2020-05-17

共1个答案

一尘不染

从一定数量开始,IN表速度更快。

MySQL 在其代码内部包含一些内容,这使得在大量常量值上构建范围比在嵌套循环中进行计算要慢。

有关性能的详细信息,请参见我的博客中的这篇文章:

2020-05-17