2

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

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

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

  2. 创建一个包含 1001 列的列表,用于存储列表及其主键。我不确定这在存储方面的成本是多少?这也感觉像是在滥用系统。然后,如果我需要存储 100000 个索引怎么办?

  3. 仅使用 SQL 存储包含我的索引的二进制文件的名称并执行 fopen(); fseek(); fread(); 每次访问的 fclose() 循环?不确定系统文件系统缓存将如何反应。如果情况不妙,那么有很多解决方案可以解决这些问题……但这听起来有点矫枉过正,不是吗?

你对那个怎么想的?

4

3 回答 3

1

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

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

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

于 2013-03-06T13:51:46.250 回答
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'
于 2013-03-06T13:53:26.940 回答
0

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

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

选项1

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

选项 3

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

于 2013-03-06T13:55:45.447 回答