1

基本的に以下のパターンに従ってデータのページを取得する 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 インデックスですが、クエリは各クエリでデータベース全体が読み取られたかのように動作します (数行の取得はすでに非常に低速です)。私は MySQL の専門家ではありません。誰かが私が間違っていることを推測できますか?

4

3 に答える 3

3

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

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

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

于 2009-03-02T16:48:34.963 に答える
1

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')
于 2009-03-02T16:48:19.037 に答える
0

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

select my_field_A, my_field_B
FROM
  mytable
WHERE
  id <= ?

そうでない場合は、MySQL 5.1 から利用可能なパーティショニングを調べてみて、テーブルを年ごとに分類すると、速度が劇的に向上するはずです。

于 2009-03-03T13:14:43.767 に答える