是否可以在不重组表的情况下优化此查询?

时间:2018-11-14 15:29:34

标签: mysql sql

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”。

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

1 个答案:

答案 0 :(得分:3)

您可以将其缩短为:

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

这看起来更漂亮,更易于编码。但这并不快。

出了什么问题? 问题出在您的数据模型上。您不应以分隔字符串存储事物列表。 SQL有这种存储列表的好方法。它称为,而不是字符串。

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

相关问题