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

Bagaimana cara mengindeks tabel tautan dengan benar untuk koneksi banyak ke banyak di MySQL?

Itu tergantung pada cara Anda menelusuri.

Jika Anda mencari seperti ini:

/* Given a value from table1, find all related values from table2 */
SELECT *
FROM table1 t1
JOIN table_table tt ON (tt.table_1 = t1.id)
JOIN table2 t2 ON (t2.id = tt.table_2)
WHERE t1.id = @id

maka Anda perlu:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)

Dalam hal ini, table1 akan memimpin di NESTED LOOPS dan indeks Anda hanya dapat digunakan jika table1 diindeks terlebih dahulu.

Jika Anda mencari seperti ini:

/* Given a value from table2, find all related values from table1 */
SELECT *
FROM table2 t2
JOIN table_table tt ON (tt.table_2 = t2.id)
JOIN table1 t1 ON (t1.id = tt.table_1)
WHERE t2.id = @id

maka Anda perlu:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)

karena alasan di atas.

Anda tidak perlu indeks independen di sini. Indeks komposit dapat digunakan di mana saja di mana indeks biasa pada kolom pertama dapat digunakan. Jika Anda menggunakan indeks independen, Anda tidak akan dapat menelusuri kedua nilai secara efisien:

/* Check if relationship exists between two given values */
SELECT 1
FROM table_table
WHERE table_1 = @id1
  AND table_2 = @id2

Untuk kueri seperti ini, Anda memerlukan setidaknya satu indeks di kedua kolom.

Tidak ada salahnya untuk memiliki indeks tambahan untuk bidang kedua:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 PRIMARY KEY (table_1, table_2)
CREATE INDEX ix_table2 ON table_table (table_2)

Kunci utama akan digunakan untuk pencarian on both values dan untuk penelusuran berdasarkan nilai table_1 , indeks tambahan akan digunakan untuk pencarian berdasarkan nilai table_2 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Java ZonedDateTime simpan di Database

  2. Pertempuran pengkodean karakter UTF-8 json_encode()

  3. Strategi Pencadangan dan Pemulihan MySQL/MariaDB yang Berhasil

  4. Memasukkan data Biner ke MySQL (tanpa PreparedStatement)

  5. Menggunakan database NoSQL melalui MySQL