首页 > 解决方案 > 可以在不重组表的情况下优化此查询吗?

问题描述

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 变量。 serialTEXT 列包含序列号列表,以逗号分隔。

序列号是唯一的,但长度可变,因此“AAB001”和“AB001”是可能的。

也许使用正则表达式会更快?还是采用完全不同的方法?

标签: mysqlsql

解决方案


您可以将其缩短为:

SELECT p.*
FROM products p
WHERE FIND_IN_SET('{$ssz}', serial) > 0;

这更好看,更容易编码。但它并没有明显更快。

问题是什么? 您的数据模型是问题所在。 您不应该将事物列表存储在分隔字符串中。SQL 有这种非常棒的方式来存储列表。它被称为而不是字符串。

您的数据需要一个联结/关联表。然后,您可以使用适当的索引加快查询速度。


推荐阅读