2010-12-23 12 views
1

slowquerysログでこのクエリを検出しました。slowquery何が問題なのですか?

SELECT GREATEST(IFNULL(`twk-status`.`status`,0) , `groups`.`status`) 
FROM `groups` 
LEFT JOIN `twk-status` ON 
    (`twk-status`.`groupID` = `groups`.`ID` 
    AND `twk-status`.`startdate` <= FROM_UNIXTIME(1317204000) 
    AND `twk-status`.`enddate` >= FROM_UNIXTIME(1317204000) 
    AND ISNULL(`twk-status`.`deleted`) 
    AND `twk-status`.`groupID` = 11) 
WHERE `groups`.`ID` = 11; 

私は、次のレポートを生成するEXPLAIN使用してクエリを実行しました:

id table  possible_keys     key 
1 twk-status groupID,groupID_2,enddate  NULL 
1 groups  PRIMARY      PRIMARY 

これは、MySQLがTWK-状況テーブルのための3つの可能なキーのいずれかを使用しなかったことを意味します。正しい?

はここでクエリがグループID、STARTDATE、終了日を使用していますTWK-状態からキー

groupID (groupID) 
groupID_2 (groupID, startdate, enddate, deleted) 
enddate (enddate, createdate, deleted) 

だ、私はgroupID_2が鍵となるwhould思っを削除しました。

これはクエリの問題でありインデックスの問題ではありませんか?

ありがとうございました。

+0

この 'EXPLAIN'は非常に奇妙です。 'EXPLAIN'のテーブルと**正確な**出力の定義を投稿してください。 – Quassnoi

+0

あなたはどのバージョンのMySQLを使用していますか? – Quassnoi

答えて

1

あなたの説明から、注文が交換されたと判断できます。あなたはPRIMARY KEYを持っているのでgroupsから該当するレコードは、検索されているtwk-statusから各レコードの

はしかし、私はこのEXPLAINに問題があることはほぼ確信している他の人の間で(twk-status.groupID = groups.ID

を条件に参加しますMySQLLEFT JOINの注文を交換できないためです。

EXPLAINの正確な出力を投稿してください。

更新:インデックスフィールドに検索される定数値の

計画を構築し、MySQLチェックする存在。

これらのチェックの一部が失敗しました。正確にはわかりませんが、groupID = 11twk-statusに、enddate >= FROM_UNIXTIME(1317204000)のレコードにはありません。

MySQLは、twk-statusの空の行の値に置き換えられ、groupID = 11のグループのデータと共に返されます。

+0

結果が大きすぎる、ここにスクリーンショットがあります http://img141.imageshack.us/i/picture1cw.png/ – cmancre

+0

hummmmm ...クエリが0行を返しています。これを手動で実行すると、0.003秒で実行されます。なぜこのログには遅いクエリがあったのですか?あなたは推測がありますか?削除された行はありません。 – cmancre

+0

@cmancre: 'twk-status'が空の場合にのみ' const row not found'が投げられます。なぜそれが遅いとして記録されたのか言うのは難しい。テーブル「MyISAM」または「InnoDB」ですか?それはロックすることができますか? – Quassnoi

関連する問題