69

私は、プライマリロギングテーブルだけでなく、少数のルックアップテーブルを使用するイベント追跡システムに取り組んでいます。私が書いているレポートでは、統計を表示するオブジェクトを選択できます。インターフェイスには、重要度の高いもの(つまり、ヒット数)の順にすべてのオブジェクトが表示されます。

2つのテーブルのスキーマ(少し縮小されていますが、要点はわかります):

CREATE TABLE IF NOT EXISTS `event_log` (
  `event_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(5) DEFAULT NULL,
  `object_id` int(5) DEFAULT NULL,
  `event_date` datetime DEFAULT NULL,
  PRIMARY KEY (`event_id`),
  KEY `user_id` (`user_id`),
  KEY `object_id` (`object_id`)
);

CREATE TABLE IF NOT EXISTS `lookup_event_objects` (
  `object_id` int(11) NOT NULL AUTO_INCREMENT,
  `object_desc` varchar(255) NOT NULL,
  PRIMARY KEY (`object_id`)
);

私が問題を抱えているクエリは以下のとおりです。100エントリまでのテーブルでは問題なく動作しますが、EXPLAINは少し心配です。

    explain SELECT 
            el.object_id, 
            leo.object_desc, 
            COUNT(el.object_id) as count_rows
        FROM 
            event_log el 
            LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id
        GROUP BY 
            el.object_id
        ORDER BY 
            count_rows DESC,
            leo.object_desc ASC

戻り値: Using index; Using temporary; Using filesort

temporaryだから-私のスキーマやMySQLがフォールバックするためのクエリの何が問題になっていますfilesortか?それとも、ORDER BYを使用して取得できる限り最適化されていますか?

4

3 に答える 3

118

さて、ドキュメントは、「一時的な使用」が表示される正確な理由を示しています。

一時テーブルは、次のような条件下で作成できます。

ORDER BY 句と別の GROUP BY 句がある場合、または ORDER BY または GROUP BY に結合キューの最初のテーブル以外のテーブルの列が含まれている場合、一時テーブルが作成されます。

ORDER BY と組み合わせた DISTINCT には、一時テーブルが必要になる場合があります。

SQL_SMALL_RESULT オプションを使用する場合、クエリにオンディスク ストレージを必要とする要素 (後述) が含まれていない限り、MySQL はインメモリ一時テーブルを使用します。

クイックスキャンは、あなたが#1に苦しんでいることを示しています.

そして、2009 年のこのブログでは、「filesort を使用する」ということは、並べ替えをインデックスで実行できないことを意味すると述べています。計算フィールドで注文しているので、それも当てはまります。

だから、それは「間違っている」ということです。

于 2012-11-30T05:22:28.697 に答える
1

これらは、一時テーブルが作成される次の条件です。UNION クエリは一時テーブルを使用します。

一部のビューでは、TEMPTABLE アルゴリズムを使用して評価されるものや、UNION または集計を使用するものなど、一時テーブルが必要です。

ORDER BY 句と別の GROUP BY 句がある場合、または ORDER BY または GROUP BY に結合キューの最初のテーブル以外のテーブルの列が含まれている場合、一時テーブルが作成されます。

ORDER BY と組み合わせた DISTINCT には、一時テーブルが必要になる場合があります。

SQL_SMALL_RESULT オプションを使用する場合、クエリにオンディスク ストレージを必要とする要素 (後述) が含まれていない限り、MySQL はインメモリ一時テーブルを使用します。

mysql でこのリンクをたどってください: http://dev.mysql.com/doc/refman/5.1/en/internal-temporary-tables.html

于 2014-01-14T09:41:33.697 に答える