从PHP调用的查询中的MySQL(MariaDB)执行超时

时间:2016-05-13 13:46:35

标签: php mysql mariadb

我正在对我的数据库进行压力测试以寻找地理定位搜索系统。它已经在很多优化中内置了这样的方盒长/拉索引系统,以便在执行弧距计算之前缩小搜索范围。我的目标是从一张桌子上为10,000,000名用户提供服务。

目前,根据年龄,性别等其他条件,我的查询时间在0.1到0.01秒之间。这适用于在英国均匀分布的10,000,000名用户。

我有一个LIMIT条件,因为我需要向用户显示X人,其中X可以在16到40之间。

问题是当没有其他用户/少数用户匹配时,查询可能需要很长时间,因为它无法快速达到LIMIT并且可能需要扫描400,000行。

我可以看一下其他优化技巧,但我的问题是:

有没有办法让查询在X秒后放弃?如果它需要超过1秒,那么它将不会返回结果,我很高兴发生这种情况。在伪查询代码中,它将类似于:

选择数据FROM表WHERE ....... LIMIT 16 GIVEUP在1 SECOND之后

我已经考虑过使用cron解决方案来消除慢速查询,但这并不是很优雅。在生产中,每隔几秒就会调用一次查询,因此cron需要连续打开。

有什么建议吗?

  • 版本为10.1.14-MariaDB

1 个答案:

答案 0 :(得分:3)

在10.1版中使用MariaDB,您有两种限制查询的方法。它可以根据时间或查询的行总数来完成。

按行:

SELECT ... LIMIT ROWS EXAMINED rows_limit;  

你可以使用关键字EXAMINED并设置像你提到的(因为MariaDB 10.0)之类的400000行。

按时间:

  

如果设置了max_statement_time变量,则任何查询(不包括存储的)   程序)花费的时间超过max_statement_time的值   (以秒为单位指定)执行将被中止。这可以设置   全局,按会话,以及每个用户和每个查询。

如果你想要一个特定的查询,我想你可以使用它:

SET STATEMENT max_statement_time=1 FOR 
  SELECT field1 FROM table_name ORDER BY field1;  

请记住,max_statement_time设置为秒(与MySQL相反,只是毫秒),因此您可以更改它,直到找到最适合您的情况(因为MariaDB 10.1)

如果您需要更多信息,我建议您excellent post了解有关查询超时的信息。

希望这会对你有所帮助。