我有一个MySQL/PHP性能相关的问题。
我需要在表中存储与每个记录相关联的索引列表。每个列表包含1000个索引。我需要能够快速访问与给定记录关联的列表中的任何索引值。我不确定走哪条路最好。我想到了以下方法,想听听您的意见:
-
将列表存储在字符串中,作为逗号分隔的值列表或使用JSON。可能是糟糕的性能,因为我需要提取整个列表的DB到PHP只检索一个值。解析字符串也不会很快…
我可以在PHP端上的Least recently Used缓存中存储一些扩展列表以减少负载。 创建一个包含1001列的列表表,用于存储列表及其主键。我不确定这在存储方面有多贵?这也让人感觉像是在滥用系统。然后,如果我需要存储100000个索引呢?
仅使用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
这严重依赖于其他文件。您希望尽可能地将数据存储本地化,以便将来更容易维护。