Basitlik adına, tetikleyiciler veritabanı değişikliklerinin her türlü izlemesini gerçekleştirmenin yoludur. Ancak, tetikleyicileri kullandığınızda kaputun altında neler olduğunu bilmeniz gerekir.
Göre MySQL Saklı Yordam Programlama kafasının altına, sayfa 256 "Tetikleyici Asma" şu şöyle der:
Zorunlu olarak, tetikleyicilerin uygulandıkları DML ifadesine ek yük getirdiğini hatırlamak önemlidir. gerçek ek yük miktarı tetikleyicinin doğasına bağlı olacaktır, ancak --- tüm MySQL tetikleyicilerinin HER SATIR İÇİN yürüttüğü gibi --- ek yük çok sayıda satırı işleyen ifadeler için hızlı bir şekilde birikebilir. Bu nedenle, pahalı SQL deyimlerini veya yordamsal kodları tetikleyicilere yerleştirmekten kaçınmalısınız.
Tetikleyici ek yükünün genişletilmiş açıklaması 529-531. Sayfalarda verilmiştir. Bu bölümdeki sonuç noktası aşağıdakileri belirtir:
Buradaki ders şudur: tetikleme kodu bir DML ifadesinden etkilenen her satır için bir kez çalışacağından, tetikleyici kolayca DML performansında en önemli faktör haline gelebilir. Tetikleyici gövdenin içindeki kodun olabildiğince hafif olması ve özellikle de tetikleyicideki SQL ifadelerinin mümkün olduğunca dizinler tarafından desteklenmesi gerekir.
Tetikleyicileri kullanırken kitapta belirtilmeyen başka bir faktördür: Denetim günlüğü oluşturma söz konusu olduğunda, lütfen verileri ne giriş yaptığınıza dikkat edin. Bunu söylüyorum, çünkü bir MyISAM tablosuna giriş yapmayı seçerseniz, bir MyISAM tablosuna her INSERT, INSERT sırasında tam bir masa kilidi üretir. Bu, yüksek trafikli, yüksek işlem ortamlarında ciddi bir darboğaz haline gelebilir. Ayrıca, tetikleyici bir InnoDB tablosuna karşı ise ve MyISAM'deki değişiklikleri tetikleyiciden kaydederseniz, bu işlem geri alınamayan ACID uyumluluğunu gizlice devre dışı bırakır (yani, blok işlemlerini otomatik tamamlama davranışına indirir).
InnoDB tablolarında tetikleyicileri kullanırken ve günlük değişiklikleri
- Giriş yaptığınız tablo da InnoDB
- Otomatik taahhüdünüz kapalı
- İŞLEMİ BAŞLATIN ... COMMIT / ROLLBACK bloklarını iyice ayarlayın
Bu şekilde, denetim günlükleri ana tablolarda olduğu gibi COMMIT / ROLLBACK'ten yararlanabilir.
Saklı yordamları kullanma konusunda, izlenen tabloya karşı DML'nin her noktasında saklı yordamı titizlikle çağırmanız gerekir. On binlerce satır uygulama kodu karşısında kaydedilen değişiklikleri kolayca gözden kaçırabilirsiniz. Böyle bir kodu bir tetikleyiciye yerleştirmek, tüm bu DML ifadelerini bulmayı ortadan kaldırır.
UYARI
Tetiğin ne kadar karmaşık olduğuna bağlı olarak, yine de bir darboğaz olabilir. Denetim günlüğündeki darboğazları azaltmak istiyorsanız, yapabileceğiniz bir şey vardır. Ancak, küçük bir altyapı değişikliği gerektirecektir.
Emtia donanımını kullanarak iki DB sunucusu daha oluşturun
Bu, denetim günlüğü nedeniyle ana veritabanındaki (MD) yazma G / Ç'sini azaltmak için sunucu oluşturur. Bunu nasıl başarabileceğiniz aşağıda açıklanmıştır:
Adım 01) Ana veritabanındaki ikili günlük kaydını açın.
Adım 02) Ucuz bir sunucu kullanarak, MySQL'i (MD ile aynı sürüm) ikili günlük kaydı etkin olarak kurun. Bu DM olacak. MD'den DM'ye çoğaltma ayarı.
Adım 03) İkinci bir ucuz sunucu kullanarak, MySQL'i (MD ile aynı sürüm) ikili günlük kaydı devre dışı olarak ayarlayın. Her denetim tablosunu --replicate-do-table kullanacak şekilde ayarlayın . Bu AU olacak. DM'den AU'ya çoğaltma ayarı.
Adım 04) mysqldump MD tablo yapıları ve DM ve AU yükleyin.
Adım 05) MD'deki tüm denetim tablolarını BLACKHOLE depolama motorunu kullanmak için dönüştürün
Adım 06) BLACKHOLE depolama motorunu kullanmak için DM ve AU'daki tüm tabloları dönüştürün
Adım 07) AU'daki tüm denetim tablolarını MyISAM depolama motorunu kullanmak için dönüştürün
Bittiğinde
- DM, MD'den çoğalır ve yalnızca ikili günlüğüne kayıt yapar
- İle --replicate-do-tablo tüm denetim tablolarda filtresi, AU DM çoğaltılacak olacak
Bu, denetim bilgilerini ayrı bir DB sunucusunda depolamak ve MD'nin normalde sahip olacağı yazma G / Ç bozulmasını azaltmaktır.