【问题标题】:MySQL fetch time optimizationMySQL 获取时间优化
【发布时间】:2013-03-10 22:25:12
【问题描述】:

o我有一个包含 200 万个寄存器的表,但它会很快增长。基本上,该表包含具有相应描述符的图像的兴趣点。当我尝试执行选择在空间上接近查询点的点的查询时,总执行时间太长了。更准确地说,持续时间/获取 = 0.484 秒 / 27.441 秒。而且查询非常简单,只返回约 17000 行。

我的查询是:

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_size 更改为my.ini,但没有看到太大变化。
  2. 此外,我尝试将 coord_x 和 coord_y 设置为索引,但查询时间变慢了。
  3. 该表按 coord_x 字段的范围进行分区,这给了我更好的结果。

如何减少获取时间?是否有可能将其减少到毫秒?

【问题讨论】:

    标签: mysql query-optimization database-performance


    【解决方案1】:

    我也遇到过慢取问题(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)
    

    更新:

    要更改 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?

    【讨论】:

      【解决方案2】:

      如果我是对的,查询确实很快,但慢的是从数据库中获取数据。从存储中加载 170000 个结果需要 27 秒。

      您似乎使用了错误的数据库类型。尝试将表从一个数据库引擎切换到另一个。

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

      此外,您还必须制作一个脚本,在您重新启动服务器时触发,以便在您的 mysql 服务器启动时加载您的内存表

      See here for the doc

      【讨论】:

      • 我知道在Oracle中它应该更快,但是我必须在这个项目中使用MySQL。我在想 MySQL 配置中可能有一些技巧?谢谢你的回答。
      • @Andriy 我希望你也知道 MySQL 也可以使用多个数据库引擎。例如 MyISAM 和 innodb...
      • @Andriy 如果您使用像 phpmyadmin 这样的工具,那么您将能够看到您的表使用的是哪种数据库引擎。
      • 好的,配置为default-storage-engine=INNODB,我试试用MyISAM。
      • 视图只是某种别名,您在持续时间内屏蔽了对行的获取。因此,您的视图基本上所做的是它执行,获取内容,然后应用您的“从视图中选择... >
      【解决方案3】:

      增加我的缓冲区大小使我的查询更快。但是你需要用notepad++打开my.ini文件,因为如果你用记事本打开它会有一些十六进制数据。

      【讨论】:

        【解决方案4】:

        我找到了解决方法,只需禁用您的 AVG 或系统中的任何抗病毒药物,然后重新启动您的工作台

        【讨论】:

          【解决方案5】:

          确保该行没有写在你的 pom.xml 中。

          <property name="hbm2ddl.auto">create</property>
          

          如果它被写入而不是删除它。

          【讨论】:

          • 你应该参考上面提到的那行是做什么的,以使提问者和社区能够提高他们的知识
          猜你喜欢
          • 2015-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多