Saya punya meja dengan 1,4 miliar catatan. Struktur tabel adalah sebagai berikut:
CREATE TABLE text_page (
text VARCHAR(255),
page_id INT UNSIGNED
) ENGINE=MYISAM DEFAULT CHARSET=ascii
Syaratnya adalah membuat indeks di atas kolom text
.
Ukuran tabel sekitar 34G.
Saya telah mencoba membuat indeks dengan pernyataan berikut:
ALTER TABLE text_page ADD KEY ix_text (text)
Setelah 10 jam menunggu, akhirnya saya menyerah pada pendekatan ini.
Apakah ada solusi yang bisa diterapkan untuk masalah ini?
UPDATE : tabel tidak mungkin diperbarui atau dimasukkan atau dihapus. Alasan mengapa membuat indeks pada kolom text
adalah karena jenis kueri sql ini akan sering dieksekusi:
SELECT page_id FROM text_page WHERE text = ?
UPDATE : Saya telah memecahkan masalah dengan mempartisi tabel.
Tabel dipartisi menjadi 40 bagian pada kolom text
. Kemudian membuat indeks di atas meja membutuhkan waktu sekitar 1 jam untuk menyelesaikannya.
Tampaknya pembuatan indeks MySQL menjadi sangat lambat ketika ukuran tabel menjadi sangat besar. Dan partisi mengurangi tabel menjadi batang yang lebih kecil.
CREATE INDEX
pernyataan normal ?Jawaban:
Mungkinkah sistem Anda tidak sesuai dengan tugas? Saya tidak menggunakan MySQL (SQL Server di sini), tapi saya tahu sakitnya mengindeks tabel entri 800 juta. Pada dasarnya .... Anda memerlukan perangkat keras yang tepat untuk itu (seperti pada: banyak cakram cepat). Saya sekarang menggunakan hampir selusin Velociraptors dan kinerjanya bagus;)
SQL Server (bukan sebagai MS SQL Server, tetapi sebagai server basis data yang menggunakan SQL) hidup dan mati dengan akses disk, dan disk normal tidak cukup untuk tugas operasi yang lebih besar.
sumber
Anda mungkin ingin membuat indeks pada karakter pertama (misalnya, 10) dari bidang teks.
Dari Documents:
Indeks dapat dibuat yang hanya menggunakan bagian terdepan dari nilai kolom, menggunakan sintaks col_name (panjang) untuk menentukan panjang awalan indeks:
sumber
Saya telah memecahkan masalah dengan mempartisi tabel.
Tabel dipartisi menjadi 40 bagian pada kolom
text
. Kemudian membuat indeks di atas meja membutuhkan waktu sekitar 1 jam untuk menyelesaikannya.Tampaknya pembuatan indeks MySQL menjadi sangat lambat ketika ukuran tabel menjadi sangat besar. Dan partisi mengurangi tabel menjadi batang yang lebih kecil.
sumber
Atur sort_buffer_size ke 4GB (atau seberapa banyak Anda dapat bergantung pada berapa banyak memori yang Anda miliki).
Saat ini indeks buat sedang melakukan semacam tetapi karena Anda memiliki sort_buffer_size 32MB, itu pada dasarnya meronta-ronta hard drive tidak perlu.
sumber
Jika Anda tidak perlu membuat kueri seperti:
Saya akan menyarankan membuat kolom hash baru dan indeks tabel dengan kolom. Ukuran keseluruhan tabel + indeks mungkin jauh lebih kecil.
UPD : Omong-omong, 1,4 miliar integer kunci primer menempati sekitar 6 GB, yaitu panjang rata-rata string kurang dari 30 karakter, yang mengindeks pada awalan mungkin lebih disukai.
Anda juga harus melihat mesin penyimpanan MERGE .
sumber
Salah satu cara untuk melakukan ini adalah membuat tabel baru dengan set indeks dan menyalin data ke tabel baru.
Juga, pastikan Anda memiliki ruang temp yang cukup.
sumber
Jika Anda masih bertanya-tanya bagaimana melakukan yang terbaik ini, saya akan menyarankan Anda untuk menggunakan alat tabel alter online.
Ada banyak dari mereka di internet, salah satu yang terkenal adalah:
http://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html
Kami memiliki masalah yang sama dengan tabel besar (lebih dari 500 mil catatan) dan perubahannya berjalan dengan sempurna. Ini menciptakan tabel tmp baru, menambahkan pemicu pada tabel asli (untuk pembaruan baru / menghapus / menyisipkan catatan) dan sementara itu menyalin semua catatan ke tabel baru (dengan struktur baru)
Semoga berhasil!
sumber