Tyl*_*den 6 mysql performance select where query-performance
我有一个包含这些字段的表结果:
每个 number_* 列可以包含一个从 01 到 90 的数字。
我有一个带有 90 个复选框的搜索表单。用户最多可以勾选 5 个复选框。
一旦用户选择 n 复选框,我需要构建一个查询来查找包含所有这些值的行,但数字可以位于五列中的任何一列。
例子:
用户勾选复选框 02、12 和 20。我需要检索所有三个数字的所有行,但我的数字可以在任何 number_* 列中。20 可以在 number_one 列中,02 可以在 number_three 列中,12 可以在 number_four 列中。如何构建此查询?
另外,使用一列而不是五列会更好吗?结果表:
列号包含 02-12-20-57-84,其中 - 是分隔符。
示例:用户勾选复选框 02、12 和 20。所以我的查询将是
SELECT *
FROM results
WHERE numbers LIKE "%02%"
AND numbers LIKE "%12%"
AND numbers LIKE "%20%";
Run Code Online (Sandbox Code Playgroud)
更新:我目前正在使用 MySQL 进行此设置:
我计划移动寻找优化和更快的替代方案。我可以仅针对此特定表迁移到任何其他数据库。如果需要,我也可以更改表结构。该表中有大约 150k 条记录执行类似于以下内容的查询:
SELECT *
FROM TableName
WHERE '02' IN (Number_1, Number_2, Number_3, Number_4, Number_5)
AND '12' IN (Number_1, Number_2, Number_3, Number_4, Number_5)
AND '20' IN (Number_1, Number_2, Number_3, Number_4, Number_5)
Run Code Online (Sandbox Code Playgroud)
迁移到另一种 DBMS 类型会带来好处吗?
我个人会创建你的表
但是在值列中只有一个值。现在您可以在 value 列上建立索引,这应该会大大加快速度。您的查询将如下所示:
SELECT result_id
FROM TableName
WHERE VALUE IN ('02','12','20')
GROUP BY result_id
HAVING COUNT(1) >= 3
Run Code Online (Sandbox Code Playgroud)
这样做的好处之一是您现在可以轻松检查 1 个匹配项、2 个匹配项等。您还可以将他们可以检查的项目数量增加到 50 个,并且您的表结构不必更改。
现在说这对你不起作用。现在我会使用这样的东西:
SELECT *
FROM TableName
WHERE '02' IN (Number_1, Number_2, Number_3, Number_4, Number_5)
AND '12' IN (Number_1, Number_2, Number_3, Number_4, Number_5)
AND '20' IN (Number_1, Number_2, Number_3, Number_4, Number_5)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35664 次 |
| 最近记录: |