2016-05-13 96 views
3

我壓力測試我的數據庫的地理定位搜索系統。在執行弧距離計算之前,已經有很多優化建立在已有的方框長/拉特索引系統中以縮小搜索範圍。我的目標是從一張桌上爲10,000,000個用戶提供服務。MySQL(MariaDB)在查詢中執行超時從PHP調用

目前我的查詢時間是基於其他條件,如年齡,性別等,在0.1到0.01秒之間。這是爲10,000,000個用戶在英國各地均勻分佈。

我有一個限制條件,因爲我需要向用戶顯示X人,其中X可以是16和40之間

的問題是,當沒有其他用戶匹配,查詢可以/用戶數需要很長時間,因爲它不能很快達到極限,並且可能必須掃描400,000行。

可能有其他的優化技術,我可以看,但我的問題是:

有沒有辦法讓查詢X秒後放棄?如果它需要超過1秒,那麼它不會返回結果,我很高興這發生。在僞查詢代碼會是這樣的:從表

SELECT數據WHERE .......上限16 GIVEUP 1秒後

我曾經想過一個cron解決殺死查詢速度慢,但就是不是很優雅。查詢將在生產中每隔幾秒鐘調用一次,因此cron需要連續開啓。

有什麼建議嗎?

  • 版本是10.1.14,MariaDB的
+0

mysql的版本? – asurbernardo

+0

http://serverfault.com/questions/401828/how-to-automatically-kill-slow-mysql-queries-after-n-seconds –

+0

可能的重複版本是10.1.14-MariaDB – PlatformDating

回答

1

在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

希望這可以幫助你。