2017-09-12 18 views
0

私は非常に遅いMySQLの構文を持っています。これは、テーブルが5000を超えるエントリに成長しているため、基本的に使用できません。サーバーがエラーコードを送信して終了するように30秒以上かかります。どのように非常に遅いMySQLのクエリを高速化するには?

構文は次のとおりです。

SELECT 
    id, 
    user_id, 
    date 
FROM 
    table 
WHERE 
    id IN (
      SELECT 
       MAX(id) 
      FROM 
       table 
      GROUP BY date 
     ) 
    AND 
    company_id = '1' 
    AND 
    date > '1473700785' 
    AND 
    complete = '1' 
    AND 
    name = "random string" 
ORDER BY id ASC 

構造:

id - int(11) 
user_id - int(10) 
company_id - int(11) 
date - varchar(20) 
complete - varchar(2) 
name - varchar(75) 

あなたがそれを遅くすることができるもの任意のアイデアを持っていますか?それは、はるかに小さいテーブルサイズ(1000エントリ未満)で期待どおりに機能していました。

+1

の必要性を見ない、提案どのような質問に戻り、 'in'の代わりにjoinを使い、インデックスをチェックしてください。 – LONG

+1

インデックスを使用してuser_idに適用することができます –

+0

テーブルにインデックスがありますか? –

答えて

0

を使用するので、あなたは、整数としてストア日付を必要とする以外(下記のような)サブクエリから、最善の方法は、インデックスです。ここでは、ほとんどの人が

SELECT id, user_id, date 
FROM table min 

--sub queries sometimes run faster than IN/NOT IN 

JOIN (
      SELECT SELECT MAX(id) 
      FROM table 
      GROUP BY date 
    ) 
      max on max.id = min.id 

WHERE min.company_id = '1' 
AND min.date > '1473700785' 
AND min.complete = '1' 
AND min.name = "random string" 

ORDER BY min.id ASC 
+0

私の質問はいくつかの変数のインデックスを作成することで解決されたので、私は正直に言って、あなたのソリューションをまだ試していませんでした。しかし、それは私がスコープを理解するのを助け、必要に応じて追加の解答を理解して見つけることができるほど簡単です。 – user3812441

0

まず、日付フィールドのインデックスが必要です。 そして、あなたはこの表現

date > '1473700785' 
0

インデックスは良いですが、TSQLとMySQLは、同様の構文を持っていますが、それらは異なるスイートですけれども、私はSUB-SELECT

SELECT 
    MAX(t.id) as id, 
    u.user_id, 
    t.date 
FROM table t 
JOIN table u ON u.id=MAX(t.id) 
WHERE 
    t.company_id = '1' 
    AND 
    t.date > '1473700785' 
    AND 
    t. complete = '1' 
    AND 
    t.name = "random string" 
GROUP BY t.date 
ORDER BY t.id ASC 
関連する問題