【发布时间】:2016-08-20 06:21:09
【问题描述】:
我有一个这样的查询(我的真实查询包括额外的连接和过滤器):
SELECT CustomerId,
if (username = '$username', 1, 0) +
if (name = '$name' , 1, 0) +
if (phone = '$phone' , 1, 0) +
if (address = '$address' , 1, 0) AS matches
FROM Customers
ORDER BY matches DESC
LIMIT 50
该查询采用多个过滤器并将其与客户信息进行比较,以查找并返回最接近的匹配项。我的问题是这很慢,而且这个查询在一个包含数百万客户记录的巨大数据库上运行。目前正在以分钟为单位查看执行时间。
有人对我如何优化此查询或编写新查询以执行近似匹配搜索有任何建议吗?
【问题讨论】:
-
这 4 个字段:
username、name、phone和address是否已编入索引? -
能否提供
show create table Customers的输出 -
@Drew 实际查询不只是使用一个表。它正在加入包含正在搜索的特定客户信息的其他表。可能有大约 10 个表被加入。我还要注意,所有正在搜索和加入的信息都已编入索引
-
@user11406 出于好奇,查询时间是如何变得如此糟糕的?用户在很长一段时间内一定已经在处理越来越慢的查询时间了。
-
@MonkeyZeus 问题更多在于以不利用表索引的方式搜索大量客户数据。按主键或表索引过滤的常规查询很好,并且通常会像您期望的那样在几秒钟内返回结果。
标签: php mysql sql optimization query-optimization