Indeks multi-kolom atau beberapa indeks untuk tabel MySQL deret waktu?

Saya memiliki tabel MySQL MyISAM dengan sekitar 400 juta baris data harga (data 7GB + indeks 9GB) dengan 3 kolom:

CREATE TABLE `prices` (
  `ts` datetime NOT NULL,
  `id` int(10) unsigned NOT NULL,
  `price` double NOT NULL,
  PRIMARY KEY (`ts`,`instrid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1$$

Jumlah ids yang berbeda (menurut saya kardinalitas adalah kata yang tepat) adalah ~500 dan untuk sebagian besar rentang waktu yang diminati, dalam rentang waktu tersebut, kardinalitas id adalah ~20 yang lebih rendah (jadi hanya ada 20 atau lebih id yang berbeda antara bulan Maret 1 dan 2).

Kuerinya hampir secara eksklusif berbentuk:

select ts, price from prices where ts between {t1} and {t2} and id = {id}.

Sepertinya beberapa indeks harus mempercepatnya.

Apakah indeks gabungan pada ts dan id atau indeks terpisah pada ts dan id lebih baik? Beberapa alternatif ke-3? Saya juga akan menghargai rekomendasi di mana saya bisa belajar bagaimana menjawab pertanyaan ini sendiri.

Apakah tipe tabel lain (InnoDB?) lebih sesuai untuk tujuan saya?


person John Salvatier    schedule 24.02.2012    source sumber


Jawaban (1)


Saya akan menggunakan indeks gabungan tunggal pada ts, harga dan id - biasanya MySQL melakukan dua operasi, pertama ia menemukan baris menggunakan indeks, kemudian mengambil baris dari database. Namun jika Anda memiliki semua data dalam indeks maka ia hanya akan mengambil data langsung dari indeks tanpa mengambil baris dari database. Ini disebut "indeks penutup".

Mengenai pilihan basis data, kebanyakan orang tampaknya merekomendasikan InnoDB untuk penggunaan serius, ada perbandingan yang bagus di sini

person user1228295    schedule 24.02.2012
comment
Sepakat. Buatlah indeks penutup dengan kolom-kolom dengan urutan sebagai berikut (ts, id, price). - person Marcus Adams; 25.02.2012
comment
Solusi yang menarik. Saya akan mencobanya dan melihat artikel itu. Terima kasih :) - person John Salvatier; 25.02.2012
comment
Tahukah Anda jika akan menjadi masalah jika indeks ini tidak muat di memori? - person John Salvatier; 26.02.2012