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

MySQL-如何改进5000万行的表?,mysql,Mysql,全部- 所以我有一个有5600万行的表,插入数据和查询数据需要很长时间。我很好奇人们有什么建议 我的服务器有32GB的RAM(大多数未使用)、2个RAID SSD和一个E3-1270,所以它应该非常快 然而,一些select查询需要40秒以上的时间。我基本上存储游戏世界中对象的位置。结构如下: CREATE TABLE IF NOT EXISTS `object_positions2` ( `entry` mediumint(9) NOT NULL, `type` tinyint(4)

全部-

所以我有一个有5600万行的表,插入数据和查询数据需要很长时间。我很好奇人们有什么建议

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

然而,一些select查询需要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不支持这么多行吗

下面是insert语句的示例:

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');
提前谢谢!
~(Josh)

在你的一些列中添加索引(在联接和使用条件下使用它们)将帮助查询“

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

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


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

entry键没有用,因为数据已经在您的主键中。我会为主键添加一个自动插入id(将当前主键更改为唯一索引),将表转换为InnoDB(它提供了更好的并发性),并设置足够大的InnoDB缓冲池大小。如果您必须使用MyISAM,请选中为选择“谢谢”而执行此操作的
key\u buffer\u size
setting

!关于插入/替换到?@Geesu中有什么想法吗。如果where子句中使用的列不是主键(具有索引),则索引将提高查询速度基本经验法则:在
联接
where
order by
子句中使用的任何字段都应具有索引。这意味着您需要一个关于npc_标志的索引,但您也需要在该字段的派生值上进行索引,这意味着不能使用索引。sqrt/pow的东西也是如此。mysql的3d/2d索引在它只有x、y而不是Z的基础上解决了什么问题。所以我不能使用它:/Oracle和PostGIS都支持2、3和4维索引-我不确定mysql的扩展。即使只是对5600万行使用x和y,也要考虑数据库与非空间索引相关的工作:它使用x值的索引获取与x条件匹配的所有值,然后检查每一行的y条件。(可能是大量的行)使用类似RTree(空间索引)的东西可以更有效地过滤这些行。