mysql - 比 MySQL 中的 find_in_set 更快的方法(逗号分隔的长整型)

标签 mysql stored-procedures

我当前有一个存储过程,它接受 TEXT 作为输入,然后尝试在集合中查找匹配的 id。

input_ids 值是一个长整型数组“1,2,3,...”。

它可以工作,但问题是 find_in_set 很慢,我认为必须有更好的方法。

CREATE PROCEDURE `sel_network_edges_by_id`(
    IN input_ids TEXT
)
BEGIN
    SELECT id, gradient, geoJson, ... 
    FROM network.network_edges 
    WHERE FIND_IN_SET(id, input_ids);
END

表格示例

id, gradient, geoJson
1, -50, [34.34....]    
2, 110, [35.3345..]
3, 110, [35.3345..]

MySQL v8.0(Azure)

最佳答案

由于 FIND_IN_SET 无法使用索引,因此您应该使用带有 IN() 的准备好的语句,其中传递的字符串的值可以用作内部的数组IN() 通过串联:

CREATE PROCEDURE sel_network_edges_by_id(IN input_ids TEXT)
BEGIN
  PREPARE my FROM CONCAT("SELECT id, gradient, geoJson, ... 
    FROM network.network_edges 
    WHERE id IN (,", input_ids,")");
  EXECUTE my;
  DEALLOCATE PREPARE my;
END

关于mysql - 比 MySQL 中的 find_in_set 更快的方法(逗号分隔的长整型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76811145/

相关文章:

php - php/mysql存储海量数据复杂关系的最佳方式

sql-server - 加载 SSIS 包时出错

stored-procedures - 将 VARBINARY 传递给存储过程

mysql - 在 Rails 中迭代多个数据库的安全方法

MySQL 服务器连接无法通过使用 DBI 的 Perl 脚本工作,但也可以通过命令行和 GUI 工作

mysql - 如果 (B) = 0,则从 (A) 更新 (B)?

java - 如何加密管理员密码?

mysql - (STOREDPROC) 生成的 SELECT 语句 : looking for the right syntax to use near NULL

stored-procedures - 无法在 Redshift Aginity 和 aginity pro 中创建存储过程

mysql - 未调用存储过程 SQLWARNING 退出处理程序