计算列的查询改进

问题描述 投票:0回答:1

我有疑问:

SELECT *
FROM customer
WHERE tracker_id = :id
  AND is_deleted = 0
  AND (email LIKE LOWER(:text) OR phone LIKE :text)
LIMIT :startingPosition, 11

但有时执行时间太长。 我有两个索引

  1. tracker_id 和电子邮件
  2. tracker_id 和电话

但是根据电子邮件进行查询时,时间太长。使用LOWER函数时索引会生效吗?我该如何改进这个查询

sql mysql
1个回答
0
投票

查看查询,下面的行引起了我的注意,这可能是延迟的原因。

“和(电子邮件如下(:文本)或电话如:文本)”

做以下两件事,并尝试: 使用 UNION ALL 运算符使用 2 个单独的查询(一个用于电子邮件,一个用于电话),而不是“OR”条件。 (它可能会在此处返回重复项,但只是为了诊断原因,请使用 UNION ALL)。 确保变量 (:text) 表示“开头为”模式而不是“结尾为”。 如果是后者,则不会使用任何可用的索引。

我会从这个开始...

由于 LOWER 是确定性函数,因此不会影响。

© www.soinside.com 2019 - 2024. All rights reserved.