如何处理一张大桌子 MySQL?

我有一个用于存储这些元素的项目和属性的数据库。 属性的数量正在扩展,因此有一个组合表来存储与元素的值相关联的每个属性。


CREATE TABLE `item_property` /
`property_id` int/11/ NOT NULL,
`item_id` int/11/ NOT NULL,
`value` double NOT NULL,
PRIMARY KEY /`property_id`,`item_id`/,
KEY `item_id` /`item_id`/
/ ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


此数据库有两种目标:存储 /这是第一个优先级,应该非常快,我想履行很多插入物 /数百/ 几秒钟/, 提取数据 /选择帮助 item_id 和 property_id/ /这是第二个优先级,它可能会慢,但不是太多,因为它会破坏我的用途 DB/.

目前,此表包含 1.6 数十亿的记录,并且简单的计数可能会占用 2 分钟...插入不足以使用它。

我用 Zend_Db 为了访问您的数据,如果您,我会非常高兴

不是

让我开发任何一方元素 PHP.
已邀请:

风见雨下

赞同来自:

如果由于某种原因找不到使用各种数据库管理系统或群集分区系统的解决方案,您还有三个主要的东西

根本

提高您的生产力 /当然,他们与集群合作/:

设置存储机制 MyISAM

使用 "LOAD DATA INFILE filename INTO TABLE tablename"

将数据划分为多个表格。

就这样。 读 rest 只有您对细节感兴趣 :/

你还读了吗? OK 那就是什么:Myisam是基石,因为这是今天最快的发动机。 而不是使用常规运算符插入数据线 SQL, 您必须将它们包装到文件中
http://dev.mysql.com/doc/refma ... .html
定期间隔 /正如您需要的那样,但很少,因为您的应用程序允许/. 因此,您可以每分钟插入大约一百万行。

下一件事限制了你 - 是你的 keys/indexes., 当他们不适合你的记忆 /因为他们太大了/, 您将体验到刀片和请求的巨大减速。 这就是为什么将数据分为多个表,所有这些都具有相同的方案。 每个表必须尽可能多,而无需在一次加载一个时填充内存。 准确的尺寸取决于您的汽车和指数,当然,但应该在某个地方 5 和 50 百万 rows/table. 如果只是衡量插入另一个巨大线路所需的时间,请在逐步缩短时刻,衡量它的时间。 当您了解限制时,每次上一张表接近此限制时都会在飞行中创建一个新表。

随后的解决方案 multitable 是,您必须要求您的所有表格,而不仅仅是一个需要减慢您的请求的数据 /但如果你有十亿左右的线路,那就不是太多了/. 显然,这里还有几种优化。 如果您可以用于数据分离的根本性 /例如,日期,客户或其他东西/, 您可以使用结构化模板将它们分成不同的表,该模板允许您知道某些类型的数据所在的位置,甚至不是询问表。 仅针对可能包含所请求数据等的查询表使用这些知识。

如果你需要一个大的设置 , 切换到
http://dev.mysql.com/doc/refma ... .html
, Eineki和Oeota如何提供它。

另外,你知道这一切都不是野生物种:目前我在自己的数据上花了这种可扩展性的测试,这种方法为我们创造了奇迹。 我们设法每天插入数百万条线路,请求占用 ~100 小姐。

江南孤鹜

赞同来自:

首先,不要使用 InnoDb, 由于您似乎不需要其基本功能 MyISAM /阻止,交易等/.
所以使用 MyISAM, 它已经有了一些意义。
然后,如果它仍然不够快,请进行分度,但您已经需要看到激进的差异。

风见雨下

赞同来自:

哇,这是一张漂亮的大桌子 :/

如果需要快速存储存储,则可以使用一个运算符包装插入并插入它们 multiple INSERT. 但是,这绝对需要额外的客户端代码。 /php/, 对不起!


INSERT INTO `table` /`col1`, `col2`/ VALUES /1, 2/, /3, 4/, /5, 6/...


还可以断开所有索引 NEED, 由于索引减慢了INSERT命令的执行。

或者,您可以查看表的分区:
http://dev.mysql.com/doc/refma ... .html

詹大官人

赞同来自:

看B. memcache, 看它可以应用它的位置。 还要注意横向分区,以减小表的大小/索引。

莫问

赞同来自:

第一:一张桌子 1.6 亿纪录似乎太大了。 我在一些非常重的负载系统上工作,甚至在追踪所有动作的登记表多年来不会变得如此大。 因此,如果可能,认为您是否可以找到更优化的存储方法。 我无法提供更多的提示,因为我不知道你的结构 DB, 但我相信会有足够的空间进行优化。 1.6 数十亿录音太多了。

关于性能的几件事:

如果您不需要检查参考完整性,这不太可能,则可以切换到存储机制 MyISAM. 它有点速度,但没有足够的完整性 ckecks 和交易。

对于其他东西,需要更多信息。

董宝中

赞同来自:

你考虑过机会吗?
http://dev.mysql.com/doc/refma ... .html
部分上的表格?

涵秋

赞同来自:

重要的是要记住默认安装 MySQL 未配置为这样的艰苦工作。 确保你
http://www.ibm.com/developerwo ... .html
为了你的工作量。

要回复问题请先登录注册