質問

基本的に以下のパターンに従ってデータのページを取得するMySQLクエリを高速化したい

select
 my_field_A,
 my_field_B
where
 time_id >= UNIX_TIMESTAMP('1901-01-01  00:00:00') AND
 time_id < UNIX_TIMESTAMP('2009-01-16  00:00:00')

フィールド time_id はMySQLインデックスですが、クエリは各クエリでデータベース全体が読み取られたかのように動作します(2、3行を取得するのはかなり遅い)。私はMySQLの専門家ではありません。誰かが私が間違っていることを推測できますか?

役に立ちましたか?

解決

time_idにインデックス(Bツリー)があることを確認してください。これは、範囲クエリに対して効率的です。また、time_idが適切な時刻形式であることを確認してください。

mysqlが何をしているのかを本当に知りたい場合は、クエリの前にキーワード「explain」を追加して、mysqlクライアントで実行できます。これにより、mysqlの実行内容と実行されるスキャンの種類に関する情報が表示されます。

http://dev.mysql.com/doc /refman/5.0/en/using-explain.html

他のヒント

time_id がこれらの基準に該当する可能性が高いため、 MySQL は全表スキャンの方が良いと考えるかもしれません。

インデックスを強制する:

SELECT
 my_field_A,
 my_field_B
FROM mytable FORCE INDEX (index_name_on_time_id)
WHERE
 time_id >= UNIX_TIMESTAMP('1901-01-01  00:00:00') AND
 time_id < UNIX_TIMESTAMP('2009-01-16  00:00:00')

より低い範囲が必要ですか? 1901年より前のエントリはありますか? time_id列はどのように生成されますか? time_idが常に大きくなり、新しいエントリがDBに追加される場合、2009-01-16に最も近いエントリを持つIDを見つけて、IDで選択することを検討できます

select my_field_A, my_field_B
FROM
  mytable
WHERE
  id <= ?

そうでない場合は、MySQL 5.1で利用可能なパーティション分割をチェックして、テーブルを年単位で分解してみてください。これにより、速度が大幅に向上します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top