gpt4 book ai didi

Mysql 一个大数据库或多个小表

转载 作者:可可西里 更新时间:2023-11-01 08:37:49 26 4
gpt4 key购买 nike

我们的应用程序将为每个用户创建动态表单。

我们正在考虑两种方法

a) 我们将所有用户表单数据作为键值对存储在单个表中,然后使用 pivot table technique获取数据并进行过滤,但我认为这可能真的是巨大的资源消耗者

b) 为用户创建的每个表单创建/设计适合其设计的表,在这里我们不必进行转换,我们可以获得 mysql 的所有好处,而且我们不会有多个表的连接

我们主要关心的是可扩展性,在方案“a”中,如果表增长得非常大(如果我考虑甚至有 1000 个用户注册,这显然会发生),如果明天我们的表随之增长,我们的流量可能会增加,那么计划“b”使用 mysql 集群,但正如我在此处阅读的那样,集群有表限制 http://dev.mysql.com/doc/refman/5.0/en/mysql-cluster-limitations-database-objects.html

更新

一个新想法打动了我们,为什么不创建一个适合单个表单元素(文本字段、文本区域等)的表(作为键、值),使用基于表单的连接(连接数 = 字段数)由用户创建的定义,我们可以创建一个水平数据,而无需改变你们对这个想法的看法。

2011 年 4 月 9 日更新

我们针对联接测试了旋转

场景 - 我们有一个包含 7 个字段的表单,数据存储为(单个表单插入的示例数据)

------------------------------|   Key       |    Value     |------------------------------|   Key1      |    Value1    ||   Key2      |    Value2    ||   Key3      |    Value3    ||   Key4      |    Value4    ||   Key5      |    Value5    ||   Key6      |    Value6    ||   Key7      |    Value7    |------------------------------

对于数据透视查询,将 70000 行数据透视为 10000 次表单插入需要 0.92 秒对于 join,显示这 10000 个表单插入花费了 17.63 秒(woof.....)

我的 table

CREATE TABLE IF NOT EXISTS `vet` (  `id` int(11) NOT NULL,  `form_id` int(11) NOT NULL,  `key` varchar(255) NOT NULL,  `value` varchar(255) NOT NULL,  KEY `id` (`id`),  KEY `form_id` (`form_id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;

透视查询

SELECT id,        GROUP_CONCAT(if(`key` = 'k1', value, NULL)) as 'key1',       GROUP_CONCAT(if(`key` = 'k2', value, NULL)) as 'key2',       GROUP_CONCAT(if(`key` = 'k3', value, NULL)) as 'key3',       GROUP_CONCAT(if(`key` = 'k4', value, NULL)) as 'key4',       GROUP_CONCAT(if(`key` = 'k5', value, NULL)) as 'key5',       GROUP_CONCAT(if(`key` = 'k6', value, NULL)) as 'key6',       GROUP_CONCAT(if(`key` = 'k7', value, NULL)) as 'key7'FROM vetWHERE form_id = 2GROUP BY id

加入查询

SELECT v.id, v1.value as key1, v2.value as key2, v3.value as key3,        v4.value as key4, v5.value as key5, v6.value as key6, v7.value as key7FROM vet vLEFT JOIN vet v1 ON v1.id = v.id AND v1.`key` = "k1"LEFT JOIN vet v2 ON v2.id = v.id AND v2.`key` = "k2"LEFT JOIN vet v3 ON v3.id = v.id AND v3.`key` = "k3"LEFT JOIN vet v4 ON v4.id = v.id AND v4.`key` = "k4"LEFT JOIN vet v5 ON v5.id = v.id AND v5.`key` = "k5"LEFT JOIN vet v6 ON v6.id = v.id AND v6.`key` = "k6"LEFT JOIN vet v7 ON v7.id = v.id AND v7.`key` = "k7"WHERE v.form_id = 2GROUP BY v.id

我想我们现在会坚持旋转,如果巨大的差异是由于它们造成的,请同时查看我的查询。

请建议哪种解决方案更好,或者是否有其他更好的解决方案

苏德什

最佳答案

我建议使用一个数据库来设计它。然后,您始终可以在需要时使用分片进行水平扩展。

关于Mysql 一个大数据库或多个小表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5585134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com