MySQLでの高速ページ検索、インデックスの使用?
-
03-07-2019 - |
質問
基本的に以下のパターンに従ってデータのページを取得する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の実行内容と実行されるスキャンの種類に関する情報が表示されます。
他のヒント
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で利用可能なパーティション分割をチェックして、テーブルを年単位で分解してみてください。これにより、速度が大幅に向上します。
所属していません StackOverflow