2014-10-17 46 views
0

我試圖發現在我們龐大的數據庫中的第一項,其中「富」剛開始出現,但此查詢速度太慢:如何檢查mysql數據庫中的每個第N項?

select min(id) 
from mytable 
where data like '%foo%'; 

我很樂意以百萬計算得到足夠接近,但此查詢似乎並沒有跑得更快:

select min(id) 
from mytable 
where mod(id, 1000000) = 0 
and data like '%foo%'; 

任何想法如何讓MySQL只檢查每百萬條目?我能想到的唯一的事情就是與第一整數一個臨時表和連接上,通過1000000

+2

_「任何想法如何讓mysql只檢查每第100萬條目?」 - 這個問題意味着你甚至在這之前做錯了事情。您應該(在正常情況下)在您告訴數據庫_where_(或如何)搜索自己時不需要這種方法。很可能這個問題可以通過使用適當的索引來解決。 (儘管一個帶有'like'%foo%'的通配符搜索當然是有問題的,並且該列的索引很可能不會解決這個問題,但是也不會試圖干涉搜索是如何完成的。) – CBroe 2014-10-17 17:54:15

+0

數據太大而無法索引,特別是對於我的一個查詢。 – 2014-10-17 18:03:37

+0

是否可以計算每個第n行的id並專門檢索該行,然後測試其中的數據?它會很快,因爲它會做索引查找。 – 2014-10-17 19:17:43

回答

0

你的第二個查詢中的每個整數乘法是最有可能運行增加mod(id, 1000000) = 0的,因爲MySQL必須檢查它找到的每個id

爲了讓這個移動更快,你應該在data列上有一個索引。

同樣,使用LIMIT可能會幫助你,像這樣:

select min(id) 
from mytable 
where data like '%foo%' 
order by id 
limit 0,1000000 

,將搜索只有第0 - 10萬行。如果你沒有找到你想要的,然後增加限制 - 1000000, 2000000只看1000000 - 2000000行。

+0

謝謝,但我想每隔一百萬行檢查一次,而不是一次檢查一百萬行。 – 2014-10-17 18:05:27

+0

然後相應地更改限制。在你的情況下,將其更改爲'999999,1000000'並相應地抵消。 'limit'是你的朋友。我認爲這是一個比'where mod(id,1000000)= 0'更好的解決方案,其中mod(id,1000000)= 0'在第二個想法中強制計算每個*'id' – mmcrae 2014-10-17 18:52:20

+0

。你不想只檢查每百萬行,是嗎?這是假設在第一百萬行你會發現你的數據。你沒有理由假設。 – mmcrae 2014-10-17 18:57:03

相關問題