具有逗号分隔值

时间:2015-07-22 10:37:57

标签: mysql sql database

如果有人在mysql中提供一些小帮助,那将会非常棒。

我有一个包含10亿条记录的表,其中一列有逗号分隔值。

我有一个逗号分隔值来搜索。

我想选择那些在该逗号分隔列中具有任何值的行与该字符串值。

e.g, 表格为A,其列为comma_separated: -

enter image description here

我有一个逗号分隔值的字符串" 79,62,70,107"。

结果将是行号1,2,3,5,7,8,9,10(提到图片。)

我是用正则表达式做的,但是花了太多时间,所以我想避免这种情况用于优化目的。

2 个答案:

答案 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,使事情变得更糟:

  • 值应以其原始格式存储。因此,将整数存储为字符串是一个坏主意。
  • SQL中列表的本机结构是表,而不是列表。
  • 表上的函数功能更强大,字符串函数更多。
  • SQL不能使用索引(全文索引除外)进行字符串操作。
  • 当你有一个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)
相关问题