【问题标题】:Whats better- query with long 'where in' condition or many small queries?什么更好 - 查询长“在哪里”条件或许多小查询?
【发布时间】:2011-02-12 12:53:53
【问题描述】:

也许这有点愚蠢,但我只是不确定哪个更好。 如果我必须在 db 中检查超过 10k 行的存在,我会怎么做?

#1 - 一个查询

select id from table1 where name in (smth1,smth2...{till 30k})

#2 - 许多查询

select id from table1 where name=smth1

虽然,性能不是目标,但我也不想使用 mysql ;) 也许,任何其他解决方案都会更合适...... 谢谢。

upd:任务是获取域列表,保存新的(尚未在数据库中的)并删除从列表中消失的域。希望对您有所帮助...

【问题讨论】:

  • 您确定不能以其他方式执行此操作吗?
  • @Lo'oris:我认为他在写“也许,任何其他解决方案会更合适”时的意思是他可以用另一种方式做到这一点

标签: php mysql codeigniter


【解决方案1】:

我不确定您的应用程序设计有多灵活,但可能值得考虑完全删除分隔列表并简单地制作一个永久的第三个表来表示多对多关系,然后将每个表连接起来查询。

【讨论】:

    【解决方案2】:

    根据您未来需要做类似的事情,您可能希望在数据库“strlist_to_table”中添加一个函数。让函数获取一个文本,其中您的输入由分隔符分隔(可能也传递给函数),在分隔符上拆分它以创建动态表。然后就可以使用了

    where in strlist_to_table('smth1|smth2', '|')
    

    并且还可以防止 sql 注入(也许小 Bobby Tables 会出现在输入中)。

    只要我的 2 美分...

    【讨论】:

      【解决方案3】:

      单个查询很可能会执行得更好,因为第二个查询会产生很多往返延迟。但是,如果您的示例中有很多名称,则第一种方法可能会导致您达到内部限制。

      在这种情况下,最好将名称列表存储在临时表中并与之连接。

      【讨论】:

        【解决方案4】:

        您应该做的是创建一个临时表,插入所有名称,然后(使用一个查询)连接该表以供您选择。

        select id 
        from table1 t1
        inner join temptable tt on t1.name = tt.name
        

        【讨论】:

        • 你的意思是,首先 - 创建临时表 temptable(name varchar(255));然后在其中插入许多行并像您的示例一样加入它?
        • @DCrystal:是的,完全正确。名称列表来自哪里?
        • 名称列表来自 php 脚本 - 它从某个 url 获取列表...但我不确定您为什么问这个问题?
        • @DCrystal - 因为如果它来自数据库,可能会有不同的方法。
        猜你喜欢
        • 2016-09-19
        • 2013-03-30
        • 1970-01-01
        • 1970-01-01
        • 2011-04-15
        • 1970-01-01
        • 1970-01-01
        • 2011-12-16
        相关资源
        最近更新 更多