【问题标题】:Query select a bulk of IDs from a table - SQL查询从表中选择大量 ID - SQL
【发布时间】:2010-07-31 13:43:41
【问题描述】:

我有一个包含约 1M 行的表。我的应用程序有一个属于该表的大约 10 万个 ID 的列表(该列表由应用程序层生成)。

是否有查询所有这些 ID 的通用方法? ~100K 选择查询?我向其中插入约 100K ID 的临时表,并通过连接所需的表来选择查询?

谢谢, 多里酒吧

【问题讨论】:

    标签: sql mysql sqlite


    【解决方案1】:

    你可以在一个查询中完成,比如

    SELECT * FROM large_table WHERE id IN (...)
    

    在我放置...的位置插入一个逗号分隔的 ID 列表 不幸的是,据我所知,没有简单的方法可以对其进行参数化,因此您需要格外小心以避免 SQL 注入漏洞。

    【讨论】:

    • 在 1 个查询中选择 100K 个 ID?您是否知道此类查询的最大长度?
    【解决方案2】:

    保存 100k ID 的临时表似乎是一个不错的解决方案。不过不要一一插入; MySQL 中的 INSERT ... VALUES 语法接受多行的插入。

    顺便问一下,如果不是从数据库中获得的 100k ID,您从哪里获得?如果它们来自前面的请求,我建议让它填充临时表。

    编辑:对于更便携的多次插入方式:

    INSERT INTO mytable (col1, col2) SELECT 'foo', 0 UNION SELECT 'bar', 1 
    

    【讨论】:

    • 此类插入查询的最大长度是多少?一次插入 ~100K 是否很常见?
    • @Vanmachin,不过,SQLite 不能像这样进行多次插入。
    • 我不知道 MySQL 如何适应这种类型的请求,但为了避免请求过大,我会先通过 INSERT 获得一百个 ID。 @MPelletier:回答已编辑
    • @Vanmachin:我想知道,你为什么不建议一次简单地选择 100 个 ID,这意味着而不是 ~100K 选择查询 - 它是 ~1K 选择查询,而不需要初始插入/临时表?
    • @MPelletier :没有测试,只是阅读了 SQLite 手册,没有说它不好
    【解决方案3】:

    这些 id 是否实际上引用了具有 1M 行的表?

    如果是这样,您可以使用 SELECT * ids FROM

    其中 ids 是 ID 列,其中“1M table”是包含 1M 行的表的名称。

    但我不认为我真的明白你的问题......

    【讨论】:

    • 是的,正如我所说,大约 100K ID 的列表属于该表。不确定我是否理解您的建议 - 您建议运行 ~100K 选择查询?
    • 不不...您对 1M 表中的所有 ID 运行 ONE select 查询,但我仍然不明白您想要什么...您有 100 万行但只有 100k身份证?如果每行都有 ID 列,难道不应该每行都有一个 ID 吗?
    • 让我澄清一下。 ~1M 表有 ~1M ID。该应用程序只有大约 100K 个 ID 的列表可供选择。您如何建议我查询约 100K 批量 ID?
    • 我现在看到了......所以你想在 1M 表中搜索 100k id。有一种简单的方法可以做到这一点,如果您编写了一个程序,将所有行加载到内存中,然后连续遍历它们以找到所有相应的 id。除此之外,您必须为每个 ID 编写一个 SELET 查询。
    • 老实说,在 C# 语言中创建一个这样的程序可能只需要 10 分钟。
    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多