mysql - 使用匹配在大数据库中按名称查询
问题描述
我试图自己想出一个解决方案,但到目前为止我没有成功
有一个包含客户姓名和地址的大型数据库,它有大约 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忽略了索引。
解决方案
40 万条记录几乎不是“大”。在大汗淋漓之前,数据库通常可以与数百万人一起工作。就像 Akina 所说,全文搜索在这里并不理想。如果您已经知道城市编号,那么您可以将其传递(作为整数)并丢弃MATCH
:
SELECT `customer_id`, `name`
FROM `table`
WHERE `city_number` = 99999 and `name` LIKE 'FIRST%SECOND'
只要city_number
有一个像样的索引,结果应该几乎是瞬时的。
推荐阅读
- r - 数据框中两列的双重匹配
- python - QSortFilterProxyModel 按日期范围过滤
- java - JavaFX getText()、setText()、toString() 给出空指针
- android - 如何防止 Android CursorLoader 重新加载?
- sql-server - 将 SQL Server 数据库迁移到 Azure 时出错
- php - 网站主页正在加载,其他页面均无效
- git - 设置 GitLab 以更新 Bitbucket 项目
- c++ - 在共享库中隐藏“_init”和“_fini”符号
- php - PDO bindParam 返回相同的结果但参数错误
- python - 尽管有 Proxymesh,来自 Ec2 的请求仍被网站阻止