相关疑难解决方法(0)

MySQL"in clause"中的项目数

我有三个表来定义用户:

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)
Run Code Online (Sandbox Code Playgroud)

我想创建一个中间层用户,该用户可以访问应用程序中的其他用户.要确定登录使用的用户可以访问哪些用户,我使用如下的子查询:

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')
Run Code Online (Sandbox Code Playgroud)

目前,我将子查询字符串存储在变量中,然后在每次需要提取用户列表时将其动态插入到外部查询中.在这样做之后,我想,"只需存储一串实际的user_ids 就更好了".

所以不要将其存储在变量中......

$subSql = "SELECT user_id FROM user_metadata WHERE user_metadata_field_id = 1 AND field_value = 'foo'";
Run Code Online (Sandbox Code Playgroud)

...我实际执行查询并存储结果,如...

$subSql = "12, 56, 89, 100, 1234, 890";
Run Code Online (Sandbox Code Playgroud)

然后当我需要拉出登录用户可以访问的点亮用户时,我可以这样做:

$sql = "SELECT user_id FROM user WHERE user_id IN ($subSql)";
Run Code Online (Sandbox Code Playgroud)

最后问题是:

您可以在MySQL IN …

mysql sql in-clause

64
推荐指数
4
解决办法
7万
查看次数

MySQL 'IN' 运算符对大量值

我正在观察我试图理解的奇怪行为。

MySQL 版本:5.7.33 我有以下查询:

select * from a_table where time>='2022-05-10' and guid in (102,512,11,35,623,6,21,673);
Run Code Online (Sandbox Code Playgroud)

a_table有主键time,guid和索引guid
我上面写的查询具有非常好的性能,并且根据解释计划是using index condition; using where; using MRR

当我增加子句中的值数量时in,性能会受到显着影响。

经过几次试运行后,我得到了一个粗略的数字。对于小于 ~14500 的值,解释计划与上面相同。对于高于此值的数量,仅解释计划uses where,并且需要永远运行我的查询。

换句话说,例如,如果我在子句中放入 14,000 个值in,则解释计划将具有预期的 14,000 行。但是,如果我在子句中放入 15,000 个值in,则解释有 221200324 行。我的整个表中甚至没有这么多行。

我试图理解这种行为,并知道是否有任何方法可以解决这个问题。

谢谢

mysql

4
推荐指数
1
解决办法
1713
查看次数

标签 统计

mysql ×2

in-clause ×1

sql ×1