-1

私はmysqlデータベースを使用しています。クエリは、ワークベンチツールを介して直接実行されます。クエリは次のようになります。

SELECT records.received, data.value 
FROM product 
       JOIN records 
            on product.productId= records.productId 
       JOIN data 
            ON records.recordId = data.recordId 
       JOIN dataTypes 
            ON data.typeId = dataTypes.typeId 
ORDER BY records.received DESC

データテーブルには100万のエントリがあります。このステートメントの実行は7秒間続きます。その理由は、ORDERBY句にあるようです。

誰かが私にそれをスピードアップする方法のヒントを教えてもらえますか?

編集:申し訳ありませんが、構造を追加するのを忘れました:

products:PKはproductIdです(5つのエントリしかありません)

レコード:PKはrecordId、FKはproductIdです

データ:PKはdataIdおよびFKrecordIdおよびtypeIdです

dataTypes:PKはtypeIdです

records.receivedとすべてのPKおよびFKにインデックスがあります。

EXPLAINの出力は次のとおりです。

id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra
1,SIMPLE,products,const,PRIMARY,PRIMARY,4,const,1,"Using index
1,SIMPLE,dataTypes,const,PRIMARY,PRIMARY,4,const,1,"Using index"
1,SIMPLE,records,ref,"PRIMARY,productId",productId,4,const,127142,"Using where"
1,SIMPLE,data,ref,"recordId,typeId",recordId,4,top70.records.recordId,1,"Using where"
4

2 に答える 2

0

クエリを次のようなものに変更してみてください。

WHERE records.received > '2012-01-01' -- some date you are sure your values fit
ORDER BY records.received DESC

EXPLAINステートメントの結果を比較します

于 2012-09-03T14:04:09.697 に答える
0
ALTER TABLE `records` ADD INDEX `index1` (`received`);
ALTER TABLE `data` ADD INDEX `index2` (`value `);

where句を使用している、または列を選択している列にインデックスを付けてみてください

于 2012-09-03T13:57:45.613 に答える