用MYSQL存储索引列表


Storing an index list with MYSQL?

我有一个MySQL/PHP性能相关的问题。

我需要在表中存储与每个记录相关联的索引列表。每个列表包含1000个索引。我需要能够快速访问与给定记录关联的列表中的任何索引值。我不确定走哪条路最好。我想到了以下方法,想听听您的意见:

  1. 将列表存储在字符串中,作为逗号分隔的值列表或使用JSON。可能是糟糕的性能,因为我需要提取整个列表的DB到PHP只检索一个值。解析字符串也不会很快…

  2. 我可以在PHP端上的Least recently Used缓存中存储一些扩展列表以减少负载。
  3. 创建一个包含1001列的列表表,用于存储列表及其主键。我不确定这在存储方面有多贵?这也让人感觉像是在滥用系统。然后,如果我需要存储100000个索引呢?

  4. 仅使用SQL存储包含索引的二进制文件的名称,并执行fopen();fseek ();从文件中读();每次访问的Fclose()循环?不确定系统文件系统缓存将如何对此作出反应。如果进展不顺利,那么有很多解决方案可以解决问题……但这听起来有点过头了,不是吗?

你觉得怎么样?

传统的一对多关系呢?

records
-------
id     int
record ...
indices
-------
record_id int
index     varchar

:

    SELECT *
      FROM records
 LEFT JOIN indices
        ON records.id = indices.record_id
     WHERE indices.index = 'foo'

标准的解决方案是创建另一个表,每个(记录,索引)一行,并添加一个MySQL索引以允许快速搜索

CREATE TABLE IF NOT EXISTS `table_list` (
  `IDrecord` int(11) NOT NULL,
  `item` int(11) NOT NULL,
  KEY `IDrecord` (`IDrecord`)
)

根据您的需要更改item的类型-我在我的示例中使用int

最合理的解决方案是将每个值放在它自己的元组中。为每个元组添加MYSQL索引将使DBMS能够快速确定值,并且应该提高性能。

我们不同意你的其他答案的原因如下:

选项1

在一个MYSQL单元格中存储多个值违反了数据库规范化的第一阶段。你可以在这里阅读。

选项3

这严重依赖于其他文件。您希望尽可能地将数据存储本地化,以便将来更容易维护。