2011-03-30 45 views
3

我有一種情況,我需要使用一個巨大的數字的極限。例如,如何提高性能極限?,1?是一個龐大的數字

"select * from a table limit 15824293949,1"; 

這是....真的很慢。有時我的家庭MySQL服務器就死掉了。

是否有可能使其更快?

對不起數量爲,不是38975901200

補充:

 
**Table 'photos' (Sample)** 

Photos 
img_id img_filename 
1  a.jpg 
2  b.jpg 
3  c.jpg 
4  d.jpg 
5  e.jpg 
and so on 
select cp1.img_id,cp2.img_id from photos as cp1 cross join photos as cp2 limit ?,1 

如何到15824293949?

我的照片列表中有177901行。我可以用

(總#行*總行#)得到的可能組合的總# - 行的總#)/ 2

+0

你的意思是說,沒有限制,這個選擇執行更快? – ajuc 2011-03-30 07:59:16

+1

你有一張380億行的桌子嗎? – WhiteFang34 2011-03-30 07:59:29

+0

@ WhiteFang34 // 38賬單行通過交叉連接生成 – Moon 2011-03-30 08:05:15

回答

2

嘗試限制與一列用WHERE條款查詢它是一個索引。例如: -

SELECT * FROM table WHERE id >= 38975901200 LIMIT 1 

更新:我想也許你甚至不需要數據庫?您可以通過計算15824293949/17790115824293949 % 177901之類的東西來找到兩個圖像的第n個組合。我想你可以編寫一個查詢:如果你想從自然秩序得到他們,他們是在數據庫(和它不發生是他們img_id)

SELECT (15824293949/177901) AS img_id1, (15824293949 MOD 177901) AS img_id2 

,那麼你可能有有些麻煩。有關係嗎?目前尚不清楚你想在這裏做什麼。

+0

@ WhiteFang34 //如果我使用連接查詢怎麼辦?行數是38975901200,但我沒有大於301228 – Moon 2011-03-30 08:06:11

+1

的ID也許你可以在你的問題中包含連接查詢? – WhiteFang34 2011-03-30 08:08:03

+0

@ WhiteFang34 //剛添加我的查詢 – Moon 2011-03-30 08:16:00

1

大概你在某種腳本中有這個,你看這個特定點的原因是因爲它是你最後一次離開的地方。

理想情況下,如果您還有一個auto_increment主鍵字段(一個id),則可以存儲該號碼。然後只要做select * from表where id> last_seen_id limit 1(也許一次做多於1):

一般來說,你要求它做什麼應該應該是慢的。給它一些東西來搜索,而不是一切都有限制。

5

MySQL對InnisDB優化的大部分MyISAM引擎的限制偏移量存在問題。有許多技術可以讓MyISAM限制更快地行動,但是在選擇語句之前添加EXPLAIN來查看實際發生的事情。交叉連接生成的30億行表明問題在於連接本身,而不是LIMIT子句。 如果您有興趣如何使LIMIT的行爲更快,this link應該爲您提供足夠的信息。

+0

任何人都可以證實InnoDB不存在這個問題嗎? – eisberg 2011-03-30 08:40:41

+0

@eisberg:我可以確認它雖然程度較低:http://explainextended.com/2011/02/11/late-row-lookups-innodb/ – Quassnoi 2011-03-30 09:49:15

+0

請注意,我沒有說過問題沒有解決不存在 - 它確實存在,但由於聚集索引和存儲某些列的方式,InnoDB優化了LIMIT OFFSET。 explainextended.com用於優化LIMIT OFFSET的技巧對InnoDB非常有用,但並非總是如此。 – 2011-03-30 09:54:49