Kami harus menyimpan informasi dasar tentang 3 juta produk. Saat ini infonya adalah CSV 180 mb yang diperbarui setiap triwulan.
Akan ada sekitar 30.000 kueri per hari, tetapi kueri itu hanyalah sebuah toko nilai kunci yang sangat sederhana. Kami hanya perlu mencari ID produk dan menampilkan sisa informasi (yang semuanya akan menjadi satu catatan).
Ini untuk web, jadi kinerja cepat sangat penting.
Haruskah kita menggunakan MySQL, meskipun kita benar-benar tidak memerlukan database relasional? Haruskah kita menghasilkan 3 juta file html statis setiap kuartal? Haruskah kita menyimpan CSV satu baris untuk setiap produk pada sesuatu seperti Amazon S3 atau Rackspace Cloud Files? Apa cara terbaik untuk melakukan ini?
Dan sekarang untuk sesuatu yang sama sekali berbeda:
Diberikan:
Solusi di luar kotak:
Dump setiap produk sebagai catatan sumber daya TXT dan simpan di DNS, misalnya:
Manfaat:
Alasan mengapa ini mungkin ide yang buruk:
sumber
MySQL dengan MyISAM dan beberapa indeks bagus kedengarannya cocok untuk ini. Ada banyak pilihan lain tentu saja, tetapi MySQL sangat luas (jika tidak secara universal) didukung pada web host komersial. Tergantung pada kecepatan yang Anda butuhkan, memcached mungkin juga layak untuk dilihat , tetapi tanpa mengetahui ukuran setiap pasangan kunci / nilai, menyimpan 3 juta dari mereka dalam memori mungkin merupakan ide yang bahkan lebih buruk daripada file CSV 180Mb (oh tunggu, itu file CSV 180Mb, jadi kita tahu seberapa besar mereka. Mereka pasti pasangan yang cukup kecil, jadi memcached bisa lebih baik).
Anda tidak ingin 3 juta file HTML statis, itu akan merusak sistem file Anda. CSV satu baris, bahkan pada S3, akan memiliki masalah yang sama. Tidak ada yang mau 3 juta file di folder.
sumber
So you think MySQL is the way to go, really?
- tidak, tidak juga, tetapi sangat fleksibel dan seperti yang saya sebutkan, didukung hampir secara universal. Namun LazyOne telah memposting beberapa alternatif bagus di atas. Saya tidak ingat istilah NoSQL, tapi itu melayang-layang di otak saya di suatu tempatAnda bisa menggunakan Berkeley Database yang melakukan hal semacam ini, bahkan jika itu belum pinggul sejak awal Perl5. Berkeley hanya mendukung pasangan nilai kunci, dan Anda mengikat seluruh db ke hash dan mengaksesnya.
Menggunakan Berkeley sangat terperinci dalam banyak referensi Perl lama yang ada di rak Anda atau coba Perldoc untuk Modul CPAN BerkeleyDB . Saya biasanya menghindari menggunakan Berkeley DB (meskipun majikan saya memiliki banyak kode kuno yang memainkannya dengan jelas, dan beberapa DB sama besarnya dengan milik Anda), karena tidak menyenangkan ketika data Anda menjadi lebih kompleks.
sumber
Anda telah menandai pertanyaan Anda sebagai amazon S3.
Saya ingin menarik perhatian Anda ke salah satu produk terkait lainnya yang disebut Amazon SimpleDB.
Kedengarannya seperti model data SimpleDB akan cocok dengan jenis aplikasi Anda.
Ini bukan plug untuk itu, tetapi layak untuk dilihat terutama jika Anda berencana menggunakan layanan cloud Amazon.
Model data SDB menyerupai spreadsheet.
Lihat di sini untuk info lebih lanjut: http://aws.amazon.com/simpledb/ Dan model data: http://docs.amazonwebservices.com/AmazonSimpleDB/latest/DeveloperGuide/
sumber
Meskipun data 180MB dapat dengan mudah ditangani oleh basis data relasional, saya sangat merekomendasikan MongoDB ( http://www.mongodb.org/) di atas MySQL, Redis, MemcacheDB, dan toko nilai kunci lainnya atau basis data relasional. Alasannya adalah untuk masalah seperti ini, MongoDB adalah sistem tercepat, paling ekspresif untuk digunakan, memungkinkan pembaruan dinamis super cepat tanpa batasan skema, sehingga dokumen Anda dapat memiliki format yang berbeda jika Anda suka. Saya berada di sebuah presentasi dari guardian.co.uk tempo hari dan mereka telah membuat keputusan kebijakan untuk melarang semua database relasional dan menggunakan MongoDB secara eksklusif untuk menyajikan berita mereka. Anda dapat merasakan seberapa cepat situs web mereka dan yang telah online sejak 1995 (surat kabar online tertua di Inggris). Mereka juga telah melalui semua jenis kemacetan di masa lalu karena database relasional. Untuk 180mb, MongoDB akan melayani semuanya dari dalam memori, jadi waktu pemuatan sub-ms kemungkinan besar akan terjadi.
sumber
Anda mengatakan bahwa pertanyaan Anda hanya pencarian kunci sederhana, dengan pencarian biner Anda memerlukan 21 iterasi pada kasus terburuk, dengan kunci hash pertanyaan Anda bahkan lebih cepat. Tiga juta catatan kecil selama Anda menghindari penggabungan (atau operasi jenis produk kartesius lainnya) dan pencarian linier.
Saya berani mengatakan apa pun akan baik-baik saja. Beban Anda adalah 30000 kueri / hari berarti bahwa (dengan asumsi beban Anda konstan sepanjang hari) Anda memiliki permintaan tunggal setiap 20 detik; itu tidak terlalu buruk.
Saya akan merekomendasikan menerapkan dalam teknologi yang paling Anda kenal pertama dan kemudian mengukur apakah ini benar-benar hambatan sistem.
sumber
Cara terbaik untuk melakukan ini sangat tergantung pada kualitas dan sifat data dan pertanyaan Anda. Sebagai permulaan, 180MB data dalam satu tabel untuk produk bukanlah masalah, bagaimanapun cara Anda melihatnya. Dan 30 ribu pertanyaan per hari bahkan lebih sedikit masalah. Dengan database yang dikonfigurasi dengan benar, desktop lama apa pun dapat menangani pemuatan ini.
Orang lain telah menunjukkan dua opsi utama Anda, MySQL atau database noSQL.
Jika Anda memiliki sejumlah atribut yang ada untuk setiap produk tunggal (seperti pabrikan, harga, nomor gudang, dll. Maka pilihan terbaik Anda adalah memiliki kolom untuk atribut ini dan mengonversi pasangan kunci / nilai Anda ke dalam format tabel datar, dengan ID produk sebagai kunci utama untuk tabel itu. Ini akan bekerja dengan sangat baik bahkan jika beberapa kolom hanya digunakan oleh setengah dari baris, karena untuk sebagian besar produk Anda hanya perlu menjalankan 1 kueri untuk mengambil semua atributnya. ini adalah data tentang produk, saya rasa kemungkinan besar ini adalah struktur data Anda.
Jika atribut sangat bervariasi dalam keberadaan dan tipe data, maka Anda mungkin lebih baik menggunakan database noSQL, yang menangani skenario ini lebih efisien daripada database SQL tradisional.
Mengenai kinerja: Saya sebelumnya pernah bekerja untuk perusahaan e-commerce, di mana untuk waktu yang lama situs web diberikan dengan data dari server MySQL. Server ini memiliki 2GB RAM, database secara keseluruhan sekitar. Berukuran 5GB dan di bawah beban teratas server menangani beberapa ribu permintaan per detik. Ya, kami telah melakukan banyak optimasi kueri, tapi ini pasti bisa dilakukan.
sumber