2016-07-18 3 views
1

私が持っている私は、より多くの、サブクエリの実行が長いと長いOFFSETて増加次のmysqlのクエリMySQLのサブクエリ長い作業

SELECT DISTINCT * FROM dom_small WHERE count>=0 AND dom NOT IN 
(SELECT dom FROM dom_small WHERE was_blocked=1) 
ORDER BY count DESC LIMIT 30 OFFSET 4702020 

OFFSET 0 mysqlのクエリ負荷0秒ものの4702020 mysqlのクエリ負荷1分19,49秒この問題を解決するための方法

+2

にクエリを最適化するためのインデックスが通常より高いパフォーマンスを遅くオフセットただろう、と述べた

。 – 1000111

+1

それを考えれば、すべてを選択してからすべてをソートしてから、 '4702020'行を探してそこから30行を渡す必要があります。もちろん、それはあなたがオフセットを増やすと長く実行されます – RiggsFolly

+0

重複http://stackoverflow.com/questions/4481388/why-does-mysql-higher-limit-offset-slow-the-query-down –

答えて

0

クエリ、次のサブクエリ

SELECT DISTINCT * FROM dom_small WHERE count>=0 AND was_blocked=1 
ORDER BY count DESC LIMIT 30 OFFSET 4702020; 
+2

@Dmitriy Kupriyanov was_blocked = 1にない結果が必要です。あなたの答えは間違っています。 – Abhay

+0

考えてみてください。この場合、オフセット0または4702020の場合、すべてのクエリに対して等しい時間が得られます。約7秒。なぜ私がサブクエリを使用するのかが原因です。 –

+0

誤った結果と等しい時間はまだ失敗します。 dom "A"に25個のエントリがあり、そのうちの1つがブロックされているとマークされている場合、ユーザは実際にブロックされていない24個に関わらずdom "A"を全く見たくない。 – DRapp

0

使用を使用してと同じ結果を得ることができる:それはサブクエリの結果をキャッシュすることでパフォーマンスをスピードアップすることができ

SELECT DISTINCT * FROM dom_small WHERE count>=0 AND dom NOT IN 
    (select * from(SELECT dom FROM dom_small WHERE was_blocked=1) t1) 
    ORDER BY count DESC LIMIT 30 OFFSET 4702020 

。以前私はこの方法を使っていました。

しかし、大きな数字でオフセットを使用すると、パフォーマンスが低下します。

+0

私はサブクエリを最適化するとパフォーマンスを向上させることはできませんので、考えていただきありがとうございます。しかし、30行(2分5,96秒) –

+0

@DmitriyKupriyanovです。 –

0

数> = 0 ANDが にないDOM dom_small FROM DISTINCT *を選択します(dom_small FROM DOMを選択WHERE was_blocked = 1)カウントDESCをLIMIT BY ORDER 30 OFFSET 4702020

他のコメントは、正確であるが、私が提供できる提案は、あなたの別個のサブクエリは同じテーブル "dom_small"からのものです。また、集計カウント(*)を実行していない場合は、countというテーブルの実際の列と思われるものとは異なります。私は

(dom, was_blocked, count)