我正在尋找一種方法來確保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_1
到user_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的解決方案將是完美的。
感謝您的任何建議。