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

Apakah pengindeksan lintas tabel mungkin?

Seperti yang Anda ketahui, SQLServer mencapai ini dengan tampilan yang diindeks :

Di SQLServer, untuk memanfaatkan teknik ini, Anda harus melakukan kueri pada tampilan dan bukan tabel. Itu artinya Anda harus tahu tentang tampilan dan indeks.

MySQL tidak memiliki tampilan yang diindeks, tetapi Anda dapat mensimulasikan perilaku dengan tabel + pemicu + indeks .

Alih-alih membuat tampilan, Anda harus membuat tabel yang diindeks, pemicu untuk menjaga agar tabel data tetap terbaru, dan kemudian Anda harus membuat kueri tabel baru, bukan tabel yang dinormalisasi.

Anda harus mengevaluasi apakah overhead operasi tulis mengimbangi peningkatan dalam operasi baca.

Diedit:

Perhatikan bahwa tidak selalu perlu membuat tabel baru. Misalnya, dalam pemicu hubungan 1:N (detail master), Anda dapat menyimpan salinan bidang dari tabel 'master' ke tabel 'detail'. Dalam kasus Anda:

CREATE TABLE tableOne (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    tableTwoId INT UNSIGNED NOT NULL,
    objectId INT UNSIGNED NOT NULL,
    desnormalized_eventTime DATETIME NOT NULL,
    INDEX (objectID),
    FOREIGN KEY (tableTwoId) REFERENCES tableTwo (id)
) ENGINE=InnoDB;

CREATE TRIGGER tableOne_desnormalized_eventTime
   BEFORE INSERT ON tableOne
for each row
begin
  DECLARE eventTime DATETIME;
  SET eventTime = 
      (select eventTime 
       from tableOne
       where tableOne.id = NEW.tableTwoId);
  NEW.desnormalized_eventTime = eventTime;
end;

Perhatikan bahwa ini adalah pemicu sebelum penyisipan.

Sekarang, kueri ditulis ulang sebagai berikut:

select * from tableOne t1 
  inner join tableTwo t2 on t1.tableTwoId = t2.id
  where t1.objectId = '..'
  order by t1.desnormalized_eventTime;

Penafian:tidak diuji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mendapatkan karakter aneh saat mengambil nilai di database mysql

  2. Bagaimana cara membuka koneksi DB di Openshift?

  3. MySQL:Pisahkan daftar yang dipisahkan koma menjadi beberapa baris

  4. Mysqldump:buat nama kolom untuk sisipan saat mencadangkan

  5. Cara Memperbaiki "MySQL ERROR 1819 (HY000):" di Linux