【发布时间】:2011-01-13 14:54:21
【问题描述】:
该表包含大约 40,000,000 条记录,其中:
CREATE TABLE `event` (
`id` bigint(20) unsigned NOT NULL auto_increment,
`some_other_id_not_fk` int(10) unsigned default NOT NULL,
`event_time` datetime NOT NULL,
`radius` float default NULL,
`how_heavy` smallint(6) default NULL,
PRIMARY KEY (`id`),
KEY `event_some_other_id_not_fk` (`some_other_id_not_fk`),
KEY `event_event_time` (`event_time`)
) ENGINE=MyISAM AUTO_INCREMENT=6506226 DEFAULT CHARSET=utf8
您应该知道some_other_id_not_fk 列并不大,它仅包含7 个不同的数字。真正的痛苦是event_time 日期时间列,因为它包含大量不同的日期时间,并且基本上所有内容都是允许的:重复以及无法预测的大时间间隔而没有记录来“覆盖”它们。您还应该知道 (some_other_id_not_fk,event_time) 对必须允许有重复项:(我知道这会导致更多问题:(
我在优化 MySQL 表方面有过一些经验,但我的视野中从未出现过如此巨大的痛苦:/
“事物”的当前状态是:
-
event_time在 date1 和 date2 之间的选择(我需要这样做)的速度非常快。 :) - 我的插入很慢,我的意思是真的很慢!!!超过 30 秒,甚至更糟:临时 DISABLE 和 ENABLE KEYS 的 LOAD DATA 过程非常慢(几个小时),主要是 ENABLE 键操作。
- 磁盘上的索引大小是数据大小的 7 倍
到目前为止,我会尝试几种不同的重新索引组合,但数据的大小确实让我无法随意尝试索引和列删除/创建。
请帮助任何人解决这个问题?应该使用时间戳而不是日期时间来解决我的问题吗?或者也许我应该为day、year、...等添加额外的列并索引它们?
【问题讨论】:
-
(正常k)是什么意思?为什么 noone 只提供 SHOW CREATE TABLE 输出?每个人都试图用他们认为最能描述这张桌子的任何可怕的术语来描述一张桌子,但没有人知道他们在说什么。我讨厌它。
-
编辑您的答案以包含 SHOW CREATE TABLE 输出。还提供一些您需要优化的示例查询,以便我们提供最佳帮助。
-
@hobodave:从模糊的描述中发现规范是程序员工作的重要组成部分。
-
@Mark:所以不会给我发薪水。如果客户/用户向我描述了一个问题,那么我将使用他们给我的东西。如果我正在面试的程序员不能使用通用词汇简洁而具体地描述一个问题,他们就会失业。甚至您也无法充分理解他的问题以提供答案,这可以通过询问“您的桌子上有哪些索引?”来证明。但是,这只是要求更加模糊。 SHOW CREATE TABLE 回答了关于表结构的所有相关问题。
-
@PatlaDJ:为什么你有 40,000,000 行但你的 auto id 只有大约 600 万?
标签: mysql database optimization indexing query-optimization