2015-07-28 84 views
1

我正在尋找一種方法來確保SELECT查詢在給定的最大時間內返回,必要時返回部分結果。綁定的MySQL查詢時間和部分結果保釋

這是我面臨的更詳細的問題:

我有不少看起來像這樣的表:

table name: user_1 

date  | object_id | row_id 
2015-05-13 | 0   | 1 
2015-05-13 | 0   | 2 
2015-05-14 | 0   | 3 
... 
2015-06-15 | 0   | 5000001 
2015-06-15 | 0   | 5000002 
2015-06-15 | 0   | 5000003 
2015-06-16 | 123  | 5000004 
2015-06-17 | 435  | 5000005 

我有類似的表爲user_1user_1000

row_id有一個PRIMARY INDEX和date的INDEX。

我們正處於遷移過程中。所有新數據(2015-06-16之後)都會創建一個非零值object_id,過去的數據可以或不可以被遷移。如果2015-06-16之前的任何行具有非零的object_id字段,則會遷移表。

我試試就知道了,如果表中的數據與下面的請求遷移:

SELECT * FROM user_1 WHERE date < 2015-06-16 AND object_id > 0 LIMIT 1 

它按預期工作。數據遷移的速度很快(引擎快速找到匹配WHERE子句的行)。當數據未被遷移時(引擎解析所有行以確保沒有任何內容符合WHERE子句)速度很慢。 object_id列沒有索引,我無法創建一個索引。

要加快東西,我試圖只讀第一行:

SELECT object_id FROM user_1 ORDER BY date ASC LIMIT 1 

我在PHP代碼測試object_id > 0。它總是很快,那很好。但我可以有假的否定結果,因爲遷移過程有時不能遷移一排,在這種情況下object_id仍然是0.

我的第三次嘗試是在給定的時間範圍內搜索,以減少錯誤肯定的概率。

SELECT * FROM user_1 WHERE object_id > 0 AND date BETWEEN 2015-06-01 AND 2015-06-15 LIMIT 1 

事情是我不知道我有這些日期之間的所有user_*表中的行。在表格仍然遷移的情況下,可能在此日期範圍內沒有行。如果我設置較大的日期範圍,則查詢速度較慢。

所以,回到我的問題,我想做一個請求,搜索匹配我的WHERE子句的行,最多讓我們說100ms。如果它在3ms中發現遷移的行,查詢會很快返回,否則我會減少假陰性的情況,但我只在該嘗試中花費100毫秒。

我知道我可以設置超時MySQL 5.7,但我堅持與MySQL 5.5。表引擎是TokuDB。還有PHP 5.5與PDO。類似於ElasticSearch's timeout的解決方案將是完美的。

感謝您的任何建議。

回答

0

我找到了一種方法來通過執行一個子請求來控制我的請求的執行時間。我不知道這是否是最好的方式,但我可以通過修改內部值LIMIT來間接推斷執行時間。

設置LIMIT 10000LIMIT 100000快,但100000減少了假陰性的情況。

舊請求:

SELECT * FROM user_1 WHERE date < 2015-06-16 AND object_id > 0 LIMIT 1 

變得

SELECT * FROM (
    SELECT object_id FROM user_1 
    WHERE date < 2015-06-16 
    LIMIT 100000 
) s 
WHERE s.object_id > 0 
LIMIT 1