我正在对我的数据库进行压力测试以寻找地理定位搜索系统。它已经在很多优化中内置了这样的方盒长/拉索引系统,以便在执行弧距计算之前缩小搜索范围。我的目标是从一张桌子上为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需要连续打开。
有什么建议吗?
答案 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了解有关查询超时的信息。
希望这会对你有所帮助。