MySQL ve PHP dizi depolama soru

4 Cevap php

I have an array with 1440 vars in it. something like:

$array = array(1 => 45.76, 2 => 67.56, 3 = 79.23 ..... 1440 => 20.22);

Bu dizi alan türü olarak LongText ile tefrika ve MySQL tabloya eklenir.

Ben şimdi ne bakan değilim veri 700MB ile bir tablo olduğunu ve yakın gelecekte bazı ciddi sorunlar anlamına gelecektir.

Bu dizi depolamak daha iyi bir yolu var mı, ben php paketi () fonksiyonu duydum, ama bana nasıl yardımcı olacak? Ne yerine LongText açtı mysql BLOB türü hakkında?

Teşekkür ederim

4 Cevap

Daha fazla bilgi yardımcı olabilir:

  • Bu verileri nereden alıyorsanız?
  • Aslında sayısal mı, ya da bu örnek için sadece sadeleştirme? Sayısal değilse, ne aralığı / doğruluk gereklidir? Bu değerleri yinelenen sınırlı bir seçim yani ayrık veri mi? Veri kesin olmak zorunda mı, ya da yakın bir yaklaşım hala yeterince iyi olurdu?
  • Bu ne anlama geliyor? Bunu nasıl kullanıyorsunuz?
  • Hız, veya depolama alanı, veya kod temizlik, ya da ne en çok ilgi musunuz?
  • O kadar sık ​​değişiyor?
  • Mi 700Mb hepsi bir dizidir? PHP örnekleri bellek sınırlıdır? Eğer komut kullandığı ne kadar bellek baktı ve nasıl farklı array boyutları ile değişir mi?
  • (Ürün / depolama alanı sayısı açısından) Hiç görme bekliyorsunuz büyük tek dizi nedir?
  • Kaç farklı veri dizileri ile uğraşmak zorunda kalabilirsiniz?
  • Veri kümeleri, yani yinelenen veriler arasında herhangi bir "örtüşme" var mı?

Temsilcisi olarak sizi örnek alarak, ben 100 ile her sayısını çarparak ve çiğ olarak ikili sonra depolama tamsayı döküm düşünün. Sizin dizi verileri 2880 byte olur. Veri nadiren veya asla değiştirirse, çok verimli bir ikili dosya doğrudan bu atlamak-okuyabilir.

Diziler bu şekilde tutmayın. Dizi sözdizimi büyük bir yük verecektir.

Öyle gibi, her giriş için bir satır kullanmak daha iyidir:

TABLE `array_entries` (
    `Index` INT UNSIGNED NOT NULL,
    `Value` DOUBLE,
    `Name` CHAR(8) COMMENT 'name of the array the entry belongs to',
    PRIMARY KEY (`Name`, `Index`)
);

Eğer tek bir tabloda birden dizileri depolamak ve (ya da isterseniz bütün bir dizi) sadece ne gerek yük sağlayacaktır.

Tabii ki, arrays diziler hakkında daha fazla bilgi içeren bir tablo için (tamsayı) tarafından Name yabancı anahtar işaret değiştirebilirsiniz.

Dizeleri sıkıştırmak için gzdeflate bir göz atın. Doc Örnek:

<?php
$compressed = gzdeflate('Compress me', 9);
echo $compressed;
?>

böylece durumda, böyle bir şey yapacağım:

<?php
$compressed = gzdeflate(serialize($array), 9); //or var_export?
echo $compressed;
?>

Modern donanım üzerinde, MySQL tablodan veri 700MB kadar kötü görünmüyor. Tabii ki, bu tablo boyutunu en aza indirmek için her zaman iyidir, bu yüzden PHP sağlar sıkıştırma işlevlerinden birini kullanabilirsiniz. Read on here for more informations.

Oldukça hızlı ve oldukça iyi metni sıkıştırır çünkü ben sık sık, gzdeflate kullanın. Ama bol diğerleri mevcuttur.