我目前正在使用 MySQL Connector/Python 来查询数据库。
目前,我正在执行的流程之一如下所示:
SELECT some_column FROM some_table WHERE some_column_2 = foo_1;
SELECT some_column FROM some_table WHERE some_column_2 = foo_2;
SELECT some_column FROM some_table WHERE some_column_2 = foo_3;
...
SELECT some_column FROM some_table WHERE some_column_2 = foo_9999;
SELECT some_column FROM some_table WHERE some_column_2 = foo_10000;
我正在运行大量非常相似的查询。
每个查询的单独结果都很重要。即使给定的查询没有产生任何结果。
不幸的是,当前进行数千次查询的方法非常耗时且效率极低。
所以,我的问题是:有什么方法可以将此过程压缩为单个查询,以便它运行更有效吗?
我觉得这在 MySQL 中绝对是可能的,而且我相当确定我在这里遗漏了一些东西。
<小时/>到目前为止,我已经尝试使用MySQL Connector/Python的executemany()函数,如下所示:
cursor.executemany("SELECT some_column FROM some_table WHERE some_column_2 = %s", foo_list)
我希望这会产生每个单独查询的结果列表,但优化了尽可能多的查询。不幸的是,这似乎在 MySQL Connector/Python 中不起作用,并导致语法错误。
我猜测executemany 不适合与SELECT 语句一起使用,而只能与INSERT 语句一起使用。
<小时/>我还在互联网上搜索了执行批量选择查询的方法,但尚未找到与我的情况相关的任何内容。
我想明确指出
SELECT some_column FROM some_table WHERE some_column_2 IN (foo_1, foo_2, foo_3, etc);
不是一个有效的解决方案,因为它不保留每个单独查询的结果(或缺少结果)。
<小时/>欢迎对此提供任何帮助。
最佳答案
而不是
SELECT some_column FROM some_table WHERE some_column_2 IN (foo_1, foo_2, ..., foo_N);
只需询问
SELECT some_column, some_column_2 FROM some_table WHERE some_column_2 IN (foo_1, foo_2, ..., foo_N);
生成查询的代码知道 foo 1..N 值,并且会在第 2 列结果中看到它们的子集。
另外,使用 IN
通常是一种反模式,它会干扰 mysql 优化器创建良好计划的能力。对于大型 IN
子句,您可能会发现最好不要麻烦地填充 FOO
表,然后对其进行联接。
关于python - MySQL 用一条语句执行多个相似的选择查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45623948/