首页 文章

优化mysql查询

提问于
浏览
0

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

这是查询:

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

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

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

----+-------------+-------+------+----------------------+------+---------+------+--------+-----------------------------------+
| id | select_type | table | type | possible_keys        | key  | key_len | ref  | rows   | Extra                             |
+----+-------------+-------+------+----------------------+------+---------+------+--------+-----------------------------------+
|  1 | SIMPLE      | Customers | ALL  | CustName | NULL | NULL    | NULL | 765704 | Using where with pushed condition |
+----+-------------+-------+------+----------------------+------+---------+------+--------+-----------------------------------+

任何人都可以协助我如何优化它 .

2 回答

  • 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百万记录索引并返回所有三个查询的并集?除非你的服务器配备15K RPM SAS或SCSI磁盘,否则听起来很合理 .

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

相关问题