使用MYSQL存储索引列表?

时间:2013-03-06 13:49:30

标签: php mysql

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

我需要存储与表中每条记录关联的索引列表。每个列表包含1000个索引。我需要能够快速访问与给定记录关联的列表中的任何索引值。我不确定最好的方法。我已经想到了以下几种方式,并希望您对它们有所了解:

  1. 将列表作为逗号分隔值列表或使用JSON存储在字符串中。可能是糟糕的性能,因为我需要将整个列表从DB中提取到PHP只检索单个值。解析字符串也不会很快...我可以在PHP端的最低重用缓存中存储一​​些扩展列表以减少负载。

  2. 创建一个包含1001列的列表,用于存储列表及其主键。我不确定这对存储有多贵?这也像滥用系统一样。然后,如果我需要存储100000个索引怎么办?

  3. 只用SQL存储包含我的索引的二进制文件的名称并执行fopen(); FSEEK();的fread();每个访问的fclose()周期?不确定系统文件系统缓存将如何响应。如果它变坏了那么有很多解决方案可以解决这些问题...但这听起来有点矫枉过正吗?

  4. 你怎么看?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

一个好的旧的一对多关系怎么样?

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'

答案 2 :(得分:0)

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

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

选项1

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

选项3

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