Mysql D在逗号分隔的列表()中。

Mysql D在逗号分隔的列表()中。,mysql,sql,select,substring,Mysql,Sql,Select,Substring,它省去了构建一个250000行的“表”(是吗??)来管理几列ID的时间,而原始“表”中的一列也可以完成这项工作 25000行对MySQL来说不是问题。我管理给定表中数十亿行的数据库。如果您使用索引进行基本查询优化,那么在一个有250k行的表上进行的大多数查询都可以 而使用逗号分隔的列表会破坏任何优化查询的机会。索引无助于搜索可能不是字符串最左边前缀的子字符串,在逗号分隔的列表中搜索数字基本上就是搜索子字符串 使用逗号分隔的列表会使查询无法优化。使用FIND_IN_SET()的每个查询都将是一次表

它省去了构建一个250000行的“表”(是吗??)来管理几列ID的时间,而原始“表”中的一列也可以完成这项工作

25000行对MySQL来说不是问题。我管理给定表中数十亿行的数据库。如果您使用索引进行基本查询优化,那么在一个有250k行的表上进行的大多数查询都可以

而使用逗号分隔的列表会破坏任何优化查询的机会。索引无助于搜索可能不是字符串最左边前缀的子字符串,在逗号分隔的列表中搜索数字基本上就是搜索子字符串

使用逗号分隔的列表会使查询无法优化。使用
FIND_IN_SET()
的每个查询都将是一次表扫描,与表中的行数呈线性关系,速度会变慢

除了索引之外,使用逗号分隔列表还有其他缺点,我在回答这篇老文章时提到了这一点:

我宁愿使用正确的解决方案,也不愿使用糟糕的解决方案


然后每行存储一个id。在关系数据库中,这是正确的解决方案。

是的,我知道MySQL缺乏字符串处理能力,但有时字符串操作是更好的方法。它省去了构建一个250000行的“表”(是吗??)来管理几列ID的时间,而原始“表”中的一列也可以完成这项工作。只要使用正确的“内置”MySQL命令来操作字符串。因此,感谢您引导我使用“find_in_set”命令,这是我不知道的。这就是为什么像stackoverflow这样的门户如此优秀的原因,但是,有一个基本的细节需要解决——如下所述。是的,我知道MySQL缺乏字符串处理能力,但有时候字符串操作是更好的方法。它省去了构建一个250000行的“表”(是吗??)来管理几列ID的时间,而原始“表”中的一列也可以完成这项工作。只要使用正确的“内置”MySQL命令来操作字符串。因此,感谢您引导我使用“find_in_set”命令,这是我不知道的。这就是为什么像stackoverflow这样的门户如此优秀的原因,然而,有一个基本的细节需要解决——如下所述。听起来像
FIND\u IN\u SET()
毕竟不是一个很好的解决方案。为什么是比尔·卡温?它与正确的列配置配合使用,对我来说效果很好。这可能不是经典的编码,但内置的功能是可以使用的。太多了,无法在评论中回答。我会写一个答案。听起来好像
FIND\u IN\u SET()
毕竟不是一个很好的解决方案。为什么是比尔·卡温?它与正确的列配置配合使用,对我来说效果很好。这可能不是经典的编码,但内置的功能是可以使用的。太多了,无法在评论中回答。我会写一个答案。谢谢你的解释账单和你的旧帖子的链接。我确实理解将数字存储在字符串中通常是一个很大的禁忌,但在我的例子中,它对于我打算使用它的有限数量的I/O来说是完美的。我从未在数据库中使用过索引,只是因为我还不知道如何使用。似乎正确的方法是,如果所有250000行都需要SharedWithID值的关联列,那么我需要一个新的250000行表,其中包含相应数量的列。我现在知道了两种解决这个问题的方法,尽管其中一种看起来比另一种更为专业。你可能会喜欢我的演示文稿,或者。谢谢你的演示链接。它们在我的MySQL教程文件夹中。此外,我还决定放弃“字符串”存储方法,转而采用“整数”存储方法。我将在需要时动态地向主表添加额外的列。附加列不应超过5列。但是,如果这个数字大幅上升,我将创建新表。因此,当您需要查找特定的数字时,您必须搜索5列,因为您不知道您搜索的数字存储在哪一列。这意味着您仍然不能使用索引。我告诉你这是一个已解决的问题-创建一个子表,并在一列中每行存储一个id。然后,你可以为这一列建立索引,并高效地搜索任何值。我想起了温斯顿·丘吉尔的一句话:“你可以指望美国人做正确的事情——在他们尝试了其他一切之后。”感谢你的解释账单和你以前帖子的链接。我确实理解将数字存储在字符串中通常是一个很大的禁忌,但在我的例子中,它对于我打算使用它的有限数量的I/O来说是完美的。我从未在数据库中使用过索引,只是因为我还不知道如何使用。似乎正确的方法是,如果所有250000行都需要SharedWithID值的关联列,那么我需要一个新的250000行表,其中包含相应数量的列。我现在知道了两种解决这个问题的方法,尽管其中一种看起来比另一种更为专业。你可能会喜欢我的演示文稿,或者。谢谢你的演示链接。它们在我的MySQL教程文件夹中。此外,我还决定放弃“字符串”存储方法,转而采用“整数”存储方法。我将在需要时动态地向主表添加额外的列。附加列不应超过5列。但是,如果这个数字大幅上升,我将创建新表。因此,当您需要查找特定的数字时,您必须搜索5列,因为您不知道您搜索的数字存储在哪一列。这意味着您仍然不能使用索引。我告诉你这是一个已解决的问题-创建一个子表,并在一列中每行存储一个id。然后,您可以索引该列并高效地搜索任何值
SELECT * FROM tablename WHERE ShareWithID LIKE '1%';
SELECT * FROM tablename WHERE ShareWithID LIKE '%1,%';
where find_in_set(1, ShareWithID) > 0
where find_in_set(1, replace(ShareWithID, ' ', '')) > 0
SELECT * FROM tablename WHERE FIND_IN_SET('1', ShareWithID);