【问题标题】:Optimize mysql query优化mysql查询
【发布时间】:2010-12-15 08:11:17
【问题描述】:

我想优化这个查询,因为它需要很长时间才能执行将近一秒钟

这是查询:

IF Exists(
 Select CustFirstName From Customers
  Where (CustFirstName = InputCustFirstName)
     OR (CustLastName= InputCustLastName)
     OR (Email = InputEmail)
);

这三列都有唯一索引。我有 765704 条记录。

这是我的查询的解释结果集:

----+-------------+--------+------+---------------- ------+------+---------+------+--------+--------- -------------------------------------+ |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+--------+------+--------------- --------+------+---------+------+--------+--------- --------------------------+ | 1 |简单 |客户 |全部 |客户名称 |空 |空 |空 | 765704 |在推送条件下使用 where | +----+-------------+--------+------+--------------- --------+------+---------+------+--------+--------- --------------------------+

谁能帮我优化一下。

【问题讨论】:

    标签: mysql query-optimization


    【解决方案1】:

    您似乎没有足够的索引。只有一个possible_keys,您可能需要三个。将它们三个作为单个元组具有唯一索引是不够的。

    假设您将所有三列都编入索引。 Where (CustFirstName = InputCustFirstName) OR (CustLastName= InputCustLastName) OR (Email = InputEmail)) 通常会使查询优化器受挫。

    将使用OR 的谓词更改为使用UNION 的谓词:

    稍微解释一下你的查询,你会改变

    SELECT * FROM Customers
    WHERE CustFirstName = InputCustFirstName
    OR CustLastName = InputCustLastName
    OR Email = InputEmail
    

    到

    SELECT * FROM Customers
    WHERE CustFirstName = InputCustFirstName
    UNION
    SELECT * FROM Customers
    WHERE CustLastName = InputCustLastName
    UNION
    SELECT * FROM Customers
    WHERE Email = InputEmail
    

    【讨论】:

      【解决方案2】:

      一秒钟查询 3/4 百万记录索引 3 次并返回所有三个查询的并集?这听起来很合理,除非您有一台速度非常快的服务器,并且配备 15K RPM SAS 或 SCSI 磁盘。

      您可以尝试将其重新编码为三个独立查询的联合,每个查询对应一个列标准。这可能允许它为每一列使用一个索引。

      【讨论】:

        猜你喜欢
        • 2011-01-22
        • 2011-07-07
        • 2018-12-21
        • 2011-11-04
        • 2016-01-25
        • 2023-03-19
        相关资源
        最近更新 更多