2013-03-21 72 views
4

o我有一张拥有2百万个寄存器的表,但它的增长速度会更快。基本上这个表格包含具有各自描述符的图像的兴趣点。当我试图执行查询时,选择查询点的空间位置附近的点时,总执行时间会过长。更精确的持续时间/取数= 0.484秒/27.441秒。查询非常简单,只返回约17000行。MySQL获取时间优化

我的查询是:

SELECT fp.fingerprint_id, fp.coord_x, fp.coord_y, fp.angle, 
fp.desc1, fp.desc2, fp.desc3, fp.desc4, fp.desc5, fp.desc6, fp.desc7, fp.desc8, fp.desc9, fp.desc10, 
fp.desc11, fp.desc12, fp.desc13, fp.desc14, fp.desc15, fp.desc16, fp.desc17, fp.desc18, fp.desc19, 
fp.desc20, fp.desc21, fp.desc22, fp.desc23, fp.desc24, fp.desc25, fp.desc26, fp.desc27, fp.desc28, 
fp.desc29, fp.desc30, fp.desc31, fp.desc32 
FROM fingerprint fp 
WHERE 
fp.is_strong_point = 1 AND 
(coord_x BETWEEN 193-40 AND 193+40) AND (coord_y BETWEEN 49-15 AND 49+15) 
LIMIT 1,1000000; 

这就是我所做的。

  1. 我试图改变key_buffer_sizemy.ini,但没有看到太多的变化。
  2. 此外,我试图设置coord_x和coord_y作为索引,但查询时间变慢了。
  3. 该表由coord_x字段的范围分区,这给了我更好的结果。

我该如何缩短取时间?是否有可能将其减少到毫秒?

回答

0

如果我是正确的,查询速度非常快,但是从数据库中获取数据的速度很慢。从存储中加载170000个结果需要27秒的时间。

它看起来像你使用错误的数据库类型。尝试将表从一个数据库引擎切换到另一个。

为了获得最大速度,您可以使用MEMORY引擎。唯一的缺点是,如果必须对其进行动态更改,则必须将该表的副本存储在另一个引擎中,并且在任何更改之后,必须重新装载差异或整个表。

而且你会在重新启动服务器,以使该触发一个脚本,这样你的记忆表将在你的MySQL服务器

See here for the doc

+0

我知道在Oracle中它应该更快,但我必须在这个项目中使用MySQL。我在想在MySQL配置中可能会有一些技巧?感谢您的回答。 – andriy 2013-03-21 12:21:41

+0

@Andriy我希望你也知道MySQL也可以使用多个数据库引擎。 MyISAM和innodb,例如... – ITroubs 2013-03-21 12:22:49

+0

@Andriy如果你使用的是像phpmyadmin这样的工具,那么你将能够看到你的表使用的是什么样的数据库引擎。 – ITroubs 2013-03-21 12:24:20

8

的启动我面临缓慢获取问题太(MySQL的加载,InnoDB)。 最后我发现innodb_buffer_pool_size在我的系统中默认设置为8MB,这不足以处理查询。它增加至1GB后,性能似乎罚款:

    Duration/Fetch 
353 row(s) returned 34.422 sec/125.797 sec (8MB innodb buffer) 
353 row(s) returned 0.500 sec/1.297 sec (1GB innodb buffer) 

UPDATE:

要改变innodb_buffer_pool_size添加到您的my.cnf

innodb_buffer_pool_size=1G 

重新启动你的mysql,使其影响

参考:How to change value for innodb_buffer_pool_size in MySQL on Mac OS?