如果有人在mysql中提供一些小帮助,那将会非常棒。
我有一个包含10亿条记录的表,其中一列有逗号分隔值。
我有一个逗号分隔值来搜索。
我想选择那些在该逗号分隔列中具有任何值的行与该字符串值。
e.g, 表格为A,其列为comma_separated: -
我有一个逗号分隔值的字符串" 79,62,70,107"。
结果将是行号1,2,3,5,7,8,9,10(提到图片。)
我是用正则表达式做的,但是花了太多时间,所以我想避免这种情况用于优化目的。
答案 0 :(得分:2)
你无法真正优化你正在做的事情。基本上,您可以运行如下查询:
where find_in_set(79, comma_separated) > 0 or
find_in_set(62, comma_separated) > 0 or
find_in_set(70, comma_separated) > 0 or
find_in_set(107, comma_separated) > 0
这需要全表扫描。而且,虽然性能可能略好于正则表达式,但它仍然不会有效。
存储此数据的正确方法是作为联结表。这会将行数相乘,因此数据中的第一行在联结表中变为三行(每个值一行)。
有很多原因导致您不希望将事物列表存储为以逗号分隔的列表。您的值看起来像另一个表中的ID,使事情变得更糟:
答案 1 :(得分:0)
如果您关注性能,则应考虑修改数据库的结构。数字在基于文本的列类型中索引不好(如果有的话)。
你的" comma_separated"看起来你的整数数量是恒定的。列。
考虑为三者中的每一个创建一个单独的INT类型列,即:
num1 | num2 | num3
79 | 62 | 101
101 | 5 | 70
然后你可以做适当的选择,如:
WHERE
num1 IN (79, 62, 70, 107)
OR num2 IN (79, 62, 70, 107)
OR num3 IN (79, 62, 70, 107)