mysql - 可以在不重组表的情况下优化此查询吗?
问题描述
SELECT * FROM products WHERE
serial LIKE '{$ssz}' //exact match, no other serials in row
OR serial LIKE '%,{$ssz}' //match at list end
OR serial LIKE '%,{$ssz},%' //match between other two serials
OR serial LIKE '{$ssz},%' //match at list beginning
这是我完美运行的查询,其中 {$ssz} 是要搜索的 PHP 变量。
serial
TEXT 列包含序列号列表,以逗号分隔。
序列号是唯一的,但长度可变,因此“AAB001”和“AB001”是可能的。
也许使用正则表达式会更快?还是采用完全不同的方法?
解决方案
您可以将其缩短为:
SELECT p.*
FROM products p
WHERE FIND_IN_SET('{$ssz}', serial) > 0;
这更好看,更容易编码。但它并没有明显更快。
问题是什么? 您的数据模型是问题所在。 您不应该将事物列表存储在分隔字符串中。SQL 有这种非常棒的方式来存储列表。它被称为表而不是字符串。
您的数据需要一个联结/关联表。然后,您可以使用适当的索引加快查询速度。
推荐阅读
- r - 您可以在 rmarkdown 或 bookdown 中将 natbib 的引用样式更改为数字吗?
- java - Android Studio:应用程序未保存到数据库/从数据库读取
- angularjs - 使用 AngularJS 动态加载 Google Maps API
- google-sheets - 表格:数组结果未展开
- javascript - concat1D 中的错误:张量 [23] 的等级必须与其余的等级相同
- c# - 获取 TKey 和 TValue
- php - 使用外键获取数据时的问题
- python - Python:如何从列表中获取第 n 个元素,其中 n 来自列表
- javascript - 返回布尔值的更好方法
- webpack - 使用 Webpack 4 可以访问我的 javascript 代码中的 hash 或 contenthash,而不是 html?