Parçalanmayı önlemek ve bazı sorguların yürütülmesini bir şekilde optimize etmek için MySQL'de dizinlerin nasıl korunacağı hakkında birçok araştırma yaptım.
Ben bir tablo VS kullanılabilir veri ve dizinler tarafından kullanılan alan arasındaki oranı hesaplayan bu formüle aşinayım.
Ancak ana sorularım hala cevapsız. Belki de bu, SQL Server'da dizin bakımına aşina olduğum gerçeğinden kaynaklanıyor ve MySQL'de bir şekilde benzer olması gerektiğini düşünüyorum.
SQL sunucusunda birkaç dizine sahip olabilirsiniz ve her birinin farklı bölümleme düzeyleri olabilir. Ardından bir tanesini alabilir ve geri kalanını etkilemeden belirli bir dizinde 'REORGANIZE' veya 'REBUILD' işlemini gerçekleştirebilirsiniz.
Bildiğim kadarıyla, böyle bir 'tablo parçalanması' yoktur ve SQL Server 'tablo parçalanması' düzeltmek için herhangi bir araç sağlamaz. Sağladığı şey, iç ve dış parçaların yanı sıra, dizin parçalanmasını (bir dizin VS tarafından kullanılan sayfanın sayısı ile o sayfanın dolgunluğu ve bitişiklik arasındaki oran gibi anlaşılır) kontrol etme araçlarıdır.
Bunların hepsini anlamak en azından benim için oldukça basittir.
Şimdi, MySQL'de dizinleri koruma sırası geldiğinde, sadece yukarıda belirtildiği gibi 'tablo parçalanması' kavramı vardır.
MySQL'de bir tablonun birkaç indeksi olabilir, ancak bu ünlü formülle 'fragmantasyon oranını' kontrol ettiğimde, her bir indeksin parçalanmasını görmüyorum, ama bir bütün olarak tablo.
MySQL dizinleri optimize etmek istediğinizde, (SQL Server gibi) üzerinde çalışmak için belirli bir dizin seçmiyorum. Bunun yerine, muhtemelen tüm dizinleri etkileyen tüm tabloda bir 'OPTIMIZE' işlemi gerçekleştiriyorum.
Tablo MySQL'de optimize edildiğinde, veri + endeksler VS tarafından kullanılan alan arasındaki oran genel alan azalır, bu da sabit sürücüde fiziksel alanın azalmasına dönüşen bir tür fiziksel yeniden organizasyon anlamına gelir. Bununla birlikte, dizin parçalanması sadece fiziksel alanla ilgili değildir, aynı zamanda ekleme ve güncellemeler nedeniyle zaman içinde değişen ağacın yapısıdır.
Sonunda InnoDB / MySQL'de bir tablo aldım. Bu tabloda 3 milyon kayıt, 105 sütun ve 55 dizin bulunmaktadır. 2,1 GB olan dizinler hariç 1,5 GB'dir.
Güncelleme, ekleme için bu tablo her gün binlerce kez vuruluyor (kayıtları gerçekten silmiyoruz).
Bu tablo yıllarca yaratıldı ve hiç kimsenin endeksleri korumadığından eminim.
Orada büyük bir parçalanma bulmayı bekliyordum, ama parçalanma hesaplamasını belirtilen şekilde yaptığımda
free_space / (data_length + index_length)
sadece% 0.2'lik bir parçalanmaya sahip olduğum ortaya çıktı. IMHO oldukça gerçekçi değil.
Yani büyük sorular:
- Tabloyu bir bütün olarak değil, MySQL'de belirli bir dizinin parçalanmasını nasıl kontrol ederim?
- OPTIMIZE TABLE aslında bir dizinin iç / dış parçalanmasını SQL Server'daki gibi düzeltir mi?
- MySQL'de bir tabloyu optimize ettiğimde, aslında tablodaki tüm dizinleri yeniden oluşturuyor mu?
- Bir endeksin fiziksel alanını azaltmanın (ağacın kendisini yeniden inşa etmeden) aslında daha iyi bir performansa dönüştüğünü düşünmek gerçekçi midir?