私はmysql innodbテーブルを持っています -
create table data (
`sha256` CHAR(64) NOT NULL,
'created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
<some other fields>
PRIMARY KEY (`sha256`),
)
mysqld_slow_query で最も遅いクエリの 1 つは、
select * from data where created between "2013-02-01" and "2013-03-01";
このクエリの実行を改善するために、2 つのオプションがあります。
オプション 1: 作成時にインデックスを追加する
オプション 2: ('created', 'sha256') を主キーにし、sha256 にインデックスを追加します。
ここでの考え方は、1 か月で収集されるデータのように、多数の行を選択する場合に、アクセスされる B-tree ブロックの数を減らしたいということです。インデックスを介してこれらのレコードにアクセスする場合 (オプション 1)、レコードごとに異なるブロックにアクセスする可能性があります。代わりに、タイムスタンプで並べ替えられたレコードをプライマリ/クラスター化キーとして保存すると (オプション 2)、同じ B ツリー ブロック内に多数のレコードが見つかり、ディスクの読み取りが減少します。
しかし、何らかの理由で、オプション 1 ではパフォーマンスが向上しますが、オプション 2 ではパフォーマンスがそれほど向上しません。理由はありますか?そして、他の提案はありますか?前もって感謝します。