我正在为一个应用程序构建一个数据库,并且我正在一个更大的数据集上测试性能问题。我生成了大约 250,000 条位置记录。每个位置可以分配给许多类别,一个类别可以分配给许多位置。我的数据集为每个位置分配了 2-4 个类别。
我想允许用户通过使用通配符搜索过滤哪些类别应该允许来搜索位置。因此,也许我想将所有类别与其中的“红色”一词进行匹配。因此,如果我输入红色,现在它会显示所有类别标题中包含“红色”的位置。另外,我想用相同的字符串通配符搜索位置标题。
我写了一个有效的查询,但在大型数据集中性能很糟糕。本质上,我使用的是内部查询,如果设置了限制并且我可以快速找到结果(大约 0.05 毫秒),这很好。如果我没有立即找到任何结果,看起来它会遍历整个数据库并且查询大约需要 9-10 秒。
这是我的数据库的简化布局:
locations: id | title | address
categories: id | title
locations_categories: id | location_id | category_id
这是我目前正在使用的查询:
SELECT `id`,`title`,`address`
FROM (`locations`)
WHERE title LIKE '%string%'
AND WHERE id IN (
SELECT location_id
FROM locations_categories
JOIN categories ON categories.id = locations_categories.category_id
WHERE categories.title LIKE '%string%')