MySQL - 如何改进5000万行的表?

时间:2012-12-13 15:02:03

标签: mysql

全部 -

所以我有一个有5600万行的表,插入数据和查询它需要花费非常长的时间。我很好奇人们可能提出的任何建议。

我的服务器有32GB的RAM(大多数未使用),2X RAID SSD和E3-1270,所以它应该非常快。

然而,一些选择查询需要超过40秒。我基本上将对象的位置存储在游戏世界中。结构如下:

CREATE TABLE IF NOT EXISTS `object_positions2` (
  `entry` mediumint(9) NOT NULL,
  `type` tinyint(4) NOT NULL,
  `x_int` int(11) NOT NULL,
  `y_int` int(11) NOT NULL,
  `z_int` int(11) NOT NULL,
  `x` float NOT NULL,
  `y` float NOT NULL,
  `z` float NOT NULL,
  `continent` smallint(6) NOT NULL,
  `zone` smallint(6) NOT NULL,
  `build` float NOT NULL,
  PRIMARY KEY (`entry`,`type`,`x_int`,`y_int`,`z_int`),
  KEY `entry` (`entry`,`type`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

我基于条目和类型进行查询(这就是为什么有一个索引),并且我将浮点x,y,z四舍五入到插入的int(如果它已经存在则作为一种更有效的方式来插入浮动比较是昂贵的。)

有没有人有任何想法为什么花了这么长时间来插入甚至查询? MySQL不支持这么多行吗?

以下是示例插入语句:

REPLACE INTO `object_positions2` (`entry` ,`type` , `x_int` , `y_int` , `z_int`, `x` ,`y` ,`z` ,`continent` ,`zone` ,`build`) VALUES ('$entry', '$type', '" . round($x) . "', '" . round($y) . "', '" . round($z) . "', '$x', '$y', '$z', '$continent', '$zone', '$ZeBuild');

提前致谢! 〜乔希

3 个答案:

答案 0 :(得分:1)

在某些列上添加索引(在连接中使用它们的剂量以及在条件中使用它们)将帮助您进行查询

答案 1 :(得分:0)

如果要存储空间数据,可以考虑使用空间数据库。根据维基百科页面(http://en.wikipedia.org/wiki/Spatial_database),有一个可用于mysql的空间包,虽然我自己只使用了oracle和postgis。

至少,我建议不要将顶点存储为行,而是存储由其MBR索引的几何。

如果我不得不猜测,我怀疑入口,类型,x,y和z上的复合主键是什么会减慢您的查询和更新,特别是对于这些值可能有很多重复的5600万行

答案 2 :(得分:0)

entry密钥没用,因为数据已经在您的主键中。我会为主键添加一个autoinrement id(将当前主键更改​​为唯一索引),将表转换为InnoDB(它提供更好的并发性)并设置足够大的innodb_buffer_pool_size。如果您必须使用MyISAM,请检查key_buffer_size设置