Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Tabel dengan 80 juta catatan dan menambahkan indeks membutuhkan waktu lebih dari 18 jam (atau selamanya)! Sekarang apa?

Ok ternyata masalah ini lebih dari sekadar membuat tabel sederhana, mengindeksnya dan melupakan masalah :) Inilah yang saya lakukan untuk berjaga-jaga jika orang lain menghadapi masalah yang sama (Saya telah menggunakan contoh Alamat IP tetapi berfungsi untuk yang lain tipe data juga):

Masalah:Tabel Anda memiliki jutaan entri dan Anda perlu menambahkan indeks dengan sangat cepat

Kasus Penggunaan: Pertimbangkan untuk menyimpan jutaan alamat IP dalam tabel pencarian. Menambahkan alamat IP seharusnya tidak menjadi masalah besar tetapi membuat indeks pada alamat tersebut membutuhkan waktu lebih dari 14 jam.

Solusi :Partisi tabel Anda menggunakan Partitionin MySQL g strategi

Kasus #1:Saat tabel yang Anda inginkan belum dibuat

CREATE TABLE IPADDRESSES(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  ipaddress BIGINT UNSIGNED,
  PRIMARY KEY(id, ipaddress)
) ENGINE=MYISAM
PARTITION BY HASH(ipaddress)
PARTITIONS 20;

Kasus #2:Saat tabel yang Anda inginkan sudah dibuat. Tampaknya ada cara untuk menggunakan ALTER TABLE untuk melakukan ini, tetapi saya belum menemukan solusi yang tepat untuk ini. Sebaliknya, ada solusi yang sedikit tidak efisien:

CREATE TABLE IPADDRESSES_TEMP(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  ipaddress BIGINT UNSIGNED,
  PRIMARY KEY(id)
) ENGINE=MYISAM;

Masukkan alamat IP Anda ke dalam tabel ini. Dan kemudian buat tabel sebenarnya dengan partisi:

CREATE TABLE IPADDRESSES(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  ipaddress BIGINT UNSIGNED,
  PRIMARY KEY(id, ipaddress)
) ENGINE=MYISAM
PARTITION BY HASH(ipaddress)
PARTITIONS 20;

Dan akhirnya

INSERT INTO IPADDRESSES(ipaddress) SELECT ipaddress FROM IPADDRESSES_TEMP;
DROP TABLE IPADDRESSES_TEMP;
ALTER TABLE IPADDRESSES ADD INDEX(ipaddress)

Dan begitulah... pengindeksan pada tabel baru membutuhkan waktu sekitar 2 jam pada mesin 3.2GHz dengan RAM 1GB :) Semoga ini bisa membantu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara melewatkan banyak variabel ke PHP dengan jQuery

  2. Apakah LIMIT OFFSET,LENGTH memerlukan ORDER BY untuk pagination?

  3. Tampilan Daftar admin Django + ForeignKey =Daftar Ubah Kosong

  4. Cara Mengubah Port MySQL/MariaDB Default di Linux

  5. di mana mengedit daftar stopword teks lengkap mysql?