微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从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

解决方法:

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

按行:

SELECT ... LIMIT ROWS examineD rows_limit;  

你可以使用关键字examineD并设置像你提到的400000行(从MariaDB 10.0开始).

按时间:

If the max_statement_time variable is set, any query (excluding stored
procedures) taking longer than the value of max_statement_time
(specified in seconds) to execute will be aborted. This can be set
globally, by session, as well as per user and per query.

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

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

请记住,max_statement_time是以秒为单位设置的(与MysqL相反,为毫秒),因此您可以更改它,直到找到最适合您的情况(从MariaDB 10.1开始).

如果您需要更多信息,我建议您使用excellent post关于查询超时.

希望这对你有所帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐