0

私はまだ次の問題があります

EXPLAIN EXTENDED SELECT
  `item`.`id`,
  `item`.`timestamp`,
  `item`.`label`
  FROM
  item
WHERE
  item.dataTypeId=30
GROUP BY
  item.id
ORDER BY
  item.timestamp DESC
LIMIT 0,6;

ID とタイムスタンプは主キーのペア (mediumint+datetime) dataTypeId 外部キー (mediumint) テーブルはInnoDbとして作成されます

ID が同じでタイムスタンプが異なる (同じアイテムのバージョン) レコードがさらに存在する可能性があります。これがgroup by の理由です

たとえば、これを読みました:stackoverflowに関する同様のトピック

しかし、それは私の問題を解決しませんでした。

次のインデックスを作成しようとしました。

  1. (dataTypeId、id、timestamp) のインデックス - この順序で
  2. (dataTypeId, timestamp) のインデックス - この順序で
  3. id のインデックス
  4. タイムスタンプのインデックス

最後の2つは絶望の小さな断片です

何か基本的なことを見逃しているに違いないと思います
が、実際には何がわかりません。
解決策を期待しないでください(それはいいでしょう:)ちょうど私を正しい方法で蹴ってください:)

sort_buffer_size は 4194288 になりました

編集: 説明 - インデックスなし

"1" "SIMPLE"    "item"  "ref"   "FK_dataTypeId" "FK_dataTypeId" "4" "const" "5608"  "Using where; Using temporary; Using filesort"

インデックスを作成して説明する

"1" "SIMPLE"    "item"  "ref"   "FK_udssDataItem_1,testIndexType,testIndexTypeTimestamp,testIndexTypeIdTime"    "FK_udssDataItem_1" "4" "const" "5632"  "Using where; Using temporary; Using filesort"
4

2 に答える 2

1

クエリに問題があります。「ID によるグループ化」を行う場合、同じ ID に対して異なるタイムスタンプがあり、どちらを使用するか (Min()、max() など) を指定していない可能性があります。「ラベル」フィールドで同様の問題が発生します。

http://dev.mysql.com/tech-resources/articles/debunking-group-by-myths.html

したがって、タイムスタンプとラベルに集計関数が必要です。そうしないと、返される値が予測できない場合があります。

ID でグループ化し、タイムスタンプで並べ替えているため、MySQL はグループごとに 1 つのタイムスタンプを抽出するため、インデックスはあまり役に立ちません。このクエリではファイルソートを取り除くことができない場合があります。

于 2010-12-03T16:46:44.357 に答える
1

あなたの質問は「クエリでファイルソートを回避する方法」ですか?
その場合、MySQL にインデックス ソートを実行させるには、インデックス内のすべての列を where 句に含める必要があります。

id、timestamp の主キーを使用する必要があります

where id = myid and item.timestamp between (t1,t2)

また、無制限の範囲 (およびタイムスタンプ < now() ) にも注意してください。

datatypeID が何であるかはわかりませんが、それが唯一の条件である場合、その列だけにインデックスを追加すると、インデックスの並べ替えも提案されるはずです。ただし、(timestamp,datatypeID) にインデックスを作成する必要がある場合があります...その順序で...代わりに。

于 2010-12-03T15:42:16.920 に答える