mysql FIND_IN_SET 对比 REGEXP 性能

mysql FIND_IN_SET vs REGEXP performance

我正在写一个问题,因为我在使用 mysql 时有一个问题。

我知道它在结构上是错误的。 但是因为已经写了很多数据和代码,很难改。

我使用 typeorm set 将多个数据放在一列中。

'A,B,C,D' , 'A', 'C,D'

数据如上输入,不能输入重复值

奇怪的是使用REGEXP时速度是一样的,FIND_IN_SET因为还没有足够的数据使速度有所不同

所以我很好奇。 在下面的两个查询中,如果我必须使用它,哪个占上风?

#1
SELECT *
FROM CAT
WHERE CONCAT(",", CATDATA, ",") REGEXP ",(A|B|C|D),"  
#2
SELECT *
FROM CAT
WHERE FIND_IN_SET('A',CATDATA)
OR FIND_IN_SET('B',CATDATA)
OR FIND_IN_SET('C',CATDATA)
OR FIND_IN_SET('D',CATDATA)

最终可以拆分成不同的table, 但请理解这是一个需要立即使用的查询。

我想知道哪个更快一点,#1 或#2。 谢谢。

任一公式都必须检查 table 中的每一行;没有 INDEX 有帮助。主要成本是获取行。表达式评估是次要的。我不知道哪个更快,但我希望差异(对于整个查询)低于 10%,因此不值得担心。

typeorm 的局限性是什么? “A”真的是一个字母吗?或者它可以是更长的字符串,例如“ACE”?

你考虑过

SET('A','B','C','D','E','F')

SET 中每个项目的内部表示为 1 位,名称可以是任意字符串(不允许逗号除外)。

SETTINYINT(被视为最多 8 位)不会更快,但会减少 space.