首页 > 解决方案 > 使用匹配在大数据库中按名称查询

问题描述

我试图自己想出一个解决方案,但到目前为止我没有成功

有一个包含客户姓名和地址的大型数据库,它有大约 400kk 行,问题是返回一些结果需要大量时间(大约 10 分钟)

表布局:

柱子 类型 指数
客户ID 大整数
姓名 varchar(100) 索引全文
CITY_NUMBER 整数 指数

假设我想从客户FIRST SECOND获取customer_id,他住在 city_number 9999并且我只想要以“ FIRST ”开头的那些(因为否则会返回名为“THIRD SECOND FIRST”的人等等),名为 FIRST SECOND THIRD 的客户也应该匹配,但不是 FIRST THIRD FORTH(必须包含所有单词)

SELECT CUSTOMER_ID 
FROM `table` 
WHERE match(NAME) AGAINST('+FIRST +SECOND' in boolean mode) 
AND CITY_NUMBER = '99999' 
AND NAME like "FIRST %"

我试图将客户与他们的地址分开并使用 JOIN,但查询时间更长。

有什么我想念的吗?因为mysql忽略了索引。

标签: mysql

解决方案


40 万条记录几乎不是“大”。在大汗淋漓之前,数据库通常可以与数百万人一起工作。就像 Akina 所说,全文搜索在这里并不理想。如果您已经知道城市编号,那么您可以将其传递(作为整数)并丢弃MATCH

SELECT `customer_id`, `name` 
  FROM `table`
 WHERE `city_number` = 99999 and `name` LIKE 'FIRST%SECOND'

只要city_number有一个像样的索引,结果应该几乎是瞬时的。


推荐阅读