MySQL ile Maddileştirilmiş İzlenim (Özet Tablolar) için tercih edilen yöntem

0 Cevap php

Ben Summary Tables performans nedenleriyle oluşturmak ve korumak için gereken hangi iş yerinde bir proje geliştiriyorum. Bunun için doğru terim Materialized Views olduğuna inanıyorum.

Bunu yapmak için 2 ana nedenleri var:

  1. Denormalization

    Ben mümkün olduğunca tablolar normalize. Yani veri çekmek için birçok tablo katılmak olurdu durumlar vardır. Biz join geldiğinde oldukça kötü performans vardır MySQL Cluster ile çalışmak.

    Yani hızlı SEÇİN bulunuyor çalıştırabilirsiniz Normalleştirilmemiş Tabloları oluşturmanız gerekir.

  2. Summarize Data

    Örneğin, ben bir kaç milyon kayıtları ile işlemler tablo var. Işlemler farklı web sitelerinden gelen. Uygulama bir rapor günlük veya aylık işlem sayıları ve web sitesi başına toplam gelir tutarlarını gösterecektir üretmek gerekiyor. Ben rapor script her zaman hesaplamak istemiyorum, bu yüzden [sitede, tarih] tarafından bir arıza var olacak bir Özet Tablo oluşturmak gerekiyor.

    Bu sadece basit bir örnektir. Ben oluşturmak ve korumak için gereken özet tablolar birçok farklı türü vardır.

Geçmişte her özet tablo güncel tutmak için çeşitli cron komut yazarak bunları yaptık. Ama bu yeni projede, ben bir daha zarif ve uygun çözümü uygulamak için umut ediyorum.

Ben bir sunucu yöneticisi değilim ben, bir PHP tabanlı bir çözümü tercih ederim ve benim uygulama kodu aracılığıyla her şeyi kontrol edebilirsiniz zaman ben en rahat hissediyorum.


Solutions that I have considered:

  1. Copying VIEW's

    Çıkan tablo, tek bir SELECT sorgusu olarak temsil edilebilir ise, ben bir VIEW oluşturabilir. Onlar yavaş olduğundan, bir cronjob olabilir kopyalayan gerçek bir tabloya bu GÖRÜNÜM.

    Ancak, bu SEÇİN sorguları bazı bile cronjobs için kabul edilebilir değil o kadar yavaş olabilir. Eski satırlar bile çok güncellenmektedir değil eğer, bütün özet verileri yeniden çok verimli değildir.

  2. Custom Cronjobs for each Summary Table

    Bu benim daha önce kullanmış bir çözümdür, ama şimdi mümkünse bunu önlemek için çalışıyorum. Birçok özet tablolar olacak ise, onu korumak için dağınık olabilir.

  3. MySQL Triggers

    Her zaman orada bir INSERT, UPDATE veya DELETE, özet tablolar göre güncellenmiş böylece ana tablolar tetikleyiciler eklemek mümkündür.

    Hiçbir CronJobs olacak ve özetleri gerçek zamanlı olacaktır. Sıfırdan bir özet tablosunu yeniden bir ihtiyaç her zamankinden varsa Ancak, başka bir çözüm (yukarıda muhtemelen # 1) ile yapılması gerekir.

  4. Using ORM Hooks/Triggers

    Benim ORM olarak Doctrine kullanıyorum. INSERT / UPDATE / sırayla özet tabloları güncelleme hangi, DELETE yapmayı tetikleyecek olay dinleyicileri eklemek için bir yolu yoktur. Bir anlamda bu solüsyon yukarıda 3. benzer, ancak PHP uygulanacak beri ben bu tetikleyiciler üzerinde daha iyi kontrole sahip olacak.


Implementation Considerations:

  1. Complete Rebuilds

    Ben verimlilik için, özet tabloları yeniden ve sadece yeni veriler için güncellemek zorunda kalmamak istiyorum. Bir şey yanlış giderse durumda ama, ben ana tablolar mevcut verileri kullanarak sıfırdan özet tablosunu yeniden yeteneği gerekir.

  2. Ignoring UPDATE/DELETE on Old Data

    Bazı özetleri eski kayıtları silinen veya güncelleştirilmesi asla varsayabiliriz, ama sadece yeni kayıtlar eklenecektir. Özet süreci büyük veri güncellemeleri kontrol etmek ihtiyacı olmadığı varsayımını yaparak bir sürü iş kaydedebilirsiniz.

    Ama tabii bu tüm tablolar için geçerli olmayacaktır.

  3. Keeping a Log

    Diyelim ki erişimi olmaz, ya da ikili MySQL günlükleri kullanmak istemiyorum varsayalım.

    Yeni verileri özetleme için, özet süreç sadece özetlenebilir son kayıtları için son birincil anahtar id hatırlamak gerekiyor. Gelecek sefer o id sonra her şeyi özetlemek olabilir çalışır. Geri gitmek ve bu verileri yeniden özetlemek böylece Ancak, güncelleştirilmiş eski kayıtları / silinen izlemek için, başka bir günlüğünü gerekiyor.


Ben stratejiler, öneri ya da yardımcı olabilecek bağlantıları her türlü takdir ediyorum. Teşekkür ederiz!

0 Cevap