【问题标题】:Query performance improvement with hundreds of WHERE clauses using IN使用 IN 使用数百个 WHERE 子句提高查询性能
【发布时间】:2021-12-12 22:45:54
【问题描述】:

我想在数据库中查询使用姓名和出生日期的人员列表。要查询的人员列表由用户在 Python 中提供,我的代码构造查询字符串以提交到数据库。我正在使用类似于以下查询的内容:

SELECT * FROM table WHERE 
    (name = 'Alice' AND dob = '2000/01/01') OR
    (name = 'Bob' AND dob = '2000/01/02') OR
    (name =  'Charlie' AND dob = '2000/01/03') OR ...

这可以正常工作,但是当人数为数百人且使用 OR 分隔的相同数量的 WHERE 子句时会变得很慢。有什么方法可以让这个查询更有效率吗?我读到使用一个不使用 OR 的 WHERE 子句使用 IN 可能会更快,但我不知道如何合并出生日期:

SELECT * FROM table WHERE name IN('Alice', 'Bob', 'Charlie',...) AND dob IN()

并且需要以某种方式将出生日期与他们各自的姓名相匹配。有什么好的提高查询性能的解决方案?

【问题讨论】:

    标签: mysql sql query-optimization sqlperformance


    【解决方案1】:

    将项目插入到保持表中,然后加入到表中。您可以将表定义为还包含每个事件或会话的唯一值。

    【讨论】:

      【解决方案2】:

      您也可以将两个字段放在一个 IN() 中,例如:

      SELECT * FROM table WHERE 
       (name,dob) IN (
           ('Alice','2000/01/01')
          ,('Bob', '2000/01/02')
          ,('Charlie', '2000/01/03')
        );
      

      并在两个字段 namedob

      上创建复合索引

      【讨论】:

        【解决方案3】:

        您可以创建一个TEMPORARY TABLE 并批量插入搜索到的元组。然后您可以连接这两个表,或者使用子选择查询。您应该在至少一个表中的两个字段上有一个复合索引。

        Bernd 建议使用一种更简单的方法,可能效果很好。

        无论哪种方式,请记住您可能应该使用动态参数,以避免潜在的SQL injection attack。如果使用(临时)表,请使用 INSERT 查询的参数。否则,对于IN 子句。

        【讨论】:

          猜你喜欢
          • 2012-08-01
          • 2014-10-15
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-08
          • 2017-03-31
          • 1970-01-01
          相关资源
          最近更新 更多