我想优化这个查询,因为它需要很长时间才能执行几乎一秒钟
这是查询:
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 回答
你只需要一个
possible_keys
,你可能需要三个 . 将所有三个索引作为单个元组具有唯一索引是不够的 .假设您已将所有三列编入索引 .
Where (CustFirstName = InputCustFirstName) OR (CustLastName= InputCustLastName) OR (Email = InputEmail))
通常会使查询优化器受挫 .使用
OR
将谓词更改为使用UNION
的谓词:要稍微解释一下你的查询,你会改变
至
一秒钟三次查询3/4百万记录索引并返回所有三个查询的并集?除非你的服务器配备15K RPM SAS或SCSI磁盘,否则听起来很合理 .
您可以尝试将其重新编码为三个单独查询的联合,每个查询对应一个列标准 . 这可能允许它为每列使用索引 .