-1

全部-

所以我有一个有 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');

提前致谢!〜乔什

4

3 回答 3

1

在您的某些列上添加索引(在您在连接和 where 条件下使用它们时)将帮助您进行查询

于 2012-12-13T15:05:10.233 回答
0

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

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

如果我不得不猜测,我怀疑 entry、type、x、y 和 z 上的复合主键会减慢您的查询和更新速度,尤其是对于 5600 万行,这些值可能有很多重复项。

于 2012-12-13T15:10:59.670 回答
0

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

于 2012-12-13T15:21:19.487 回答