我必须存储大量数据对。数据对的形式为:
参数=值
并且与容器有关。它类似于 INI 文件。例如,我有一个具有以下值的容器:
p1 = 32
p2 = "hello world"
p3 = -54
另一个有:
p1 = 32
p2 = 36
p5 = 42
p6 = "bye"
每个容器的参数数量未定义。值是任意长度的数字或字符串(数字可以转换为字符串)。数据检索是通过参数名称(“所有 p1 值”)或值(“a 'p6' parameter with value 'bye'”)进行的。该数据库将包含数百万对。插入和读取将非常频繁,并且很少会删除或更新记录。
我的第一次尝试是制作两张桌子。第一个是这样的:
CREATE TABLE IF NOT EXISTS `container` (
`id` int(11) NOT NULL AUTO_INCREMENT,
OTHER CONTAINER INFO
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
whereid
将在包含对的另一个表中使用:
CREATE TABLE IF NOT EXISTS `data` (
`container` int(11) NOT NULL,
`name` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`value` text COLLATE utf8_unicode_ci NOT NULL,
KEY `container` (`container`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
添加数据:
INSERT INTO `container` (`id`) VALUES ('1'), ('2');
INSERT INTO `data` (`container`, `name`, `value`) VALUES
('1', 'p1', '32'),
('1', 'p2', 'hello world'),
('1', 'p3', '-54'),
('2', 'p1', '32'),
('2', 'p2', '36'),
('2', 'p5', '42'),
('2', 'p6', 'bye');
它可以工作,但它不是非常“可用”和快速。例如,如果我需要从每个具有 a 的容器中查找所有参数,p1=32
我必须进行两个 SQL 查询,首先:
SELECT id FROM `container` WHERE id IN (
SELECT container
FROM DATA WHERE name = 'p1'
AND value = '32')
然后为每个容器id
获取所有数据:
SELECT * FROM `data` WHERE container = '$id'
然后通过 PHP 进行后处理,因为它返回如下表:
container name value
1 p1 32
1 p2 hello world
1 p3 -54
(后处理只是对 array_* 函数的几次调用,但它会使处理速度变慢)。
我一直在使用包含 50000 个数据对的数据库进行测试,并使用此过程列出所有记录需要 5 秒以上。问题是:如何存储这种数据?或者如何提高我的实施性能?
注意:问题不在于第一个 SQL 查询(0'003 秒)或第二个 SQL 查询(每个 0'002 秒)。问题是对第一个SQL语句的每个结果进行一次SQL查询!!
注意 2:目标是拥有一个包含每个结果的 PHP 数组,并为每个结果创建一个带有键值对的关联数组。结果 a print_r
:
Array
(
[1] => Array
(
[p1] => 32
[p2] => hello world
[p3] => -54
)
[2] => Array
(
[p1] => 32
[p2] => 36
[p5] => 42
[p6] => bye
)
)
当然,我这里展示的数据结构是我的第一次尝试,我正在研究,那不是产品,所以我可以改变,完全没有问题。