Sebagai programmer basis data relasional (sebagian besar waktu), saya membaca artikel tentang bagaimana skala basis data relasional, dan solusi NoSQL seperti yang dilakukan MongoDB. Karena sebagian besar database yang saya kembangkan sejauh ini berskala kecil hingga menengah, saya tidak pernah memiliki masalah yang belum diselesaikan oleh beberapa pengindeksan, optimasi kueri, atau desain ulang skema.
Seperti apa ukuran yang saya harapkan untuk melihat MySQL berjuang. Berapa banyak baris?
(Saya tahu ini akan tergantung pada aplikasi, dan jenis data yang disimpan. Yang membuat saya pada dasarnya adalah database genetika, jadi akan memiliki satu tabel utama, dengan tabel pencarian 3 atau 4. Tabel utama akan berisi di antara hal-hal lain, referensi kromosom, dan posisi yang dikoordinasikan. Kemungkinan akan ditanyai sejumlah entri antara dua ramuan pada kromosom, untuk melihat apa yang disimpan di sana).
sumber
Jawaban:
Seberapa besar data?
Ada dua ambang batas yang signifikan:
Dengan SSD cepat ambang pertama menjadi sedikit kurang dari masalah, kecuali jika Anda memiliki lalu lintas tinggi gila.
Keasaman
Salah satu masalah dengan penskalaan RDBMSes adalah bahwa dengan desain mereka adalah ACID, yang berarti transaksi dan kunci tingkat baris (atau bahkan tingkat tabel dalam beberapa RDBMSes lama / lebih sederhana). Ini bisa menjadi faktor pembatas jika Anda memiliki banyak kueri memodifikasi banyak data yang berjalan pada saat yang sama. Solusi NoSQL biasanya digunakan untuk model konsistensi akhirnya .
Bagaimana RDBMS mengukur ukuran data?
Tidak sepenuhnya benar bahwa RDBMS tidak dapat mengukur ukuran data, ada dua alternatif: partisi vertikal dan partisi horizontal (alias sharding).
Partisi vertikal pada dasarnya menjaga tabel yang tidak terkait pada server DB yang terpisah, sehingga menjaga ukuran masing-masing di bawah ambang batas yang disebutkan di atas. Ini membuat bergabung dengan tabel-tabel ini menggunakan SQL biasa menjadi kurang lurus dan kurang efisien.
Sharding berarti mendistribusikan data dari satu tabel di antara berbagai server, berdasarkan kunci tertentu. Ini berarti bahwa untuk pencarian Anda tahu server mana yang diminta berdasarkan kunci itu. Namun, ini menyulitkan kueri yang tidak mencari kunci sharding.
Dalam hal kedua jenis partisi, jika Anda pergi ke ekstrem, Anda pada dasarnya berakhir dengan situasi yang sama dengan database NoSQL.
sumber
Saya tidak berpikir bahwa ukuran data adalah satu-satunya faktor. "Model data" juga merupakan bagian yang sangat penting.
Halaman katalog E-Commerce (Solr, ElasticSearch), data analisis web (Riak, Cassandra), harga saham (Redis), hubungan hubungan di Jejaring Sosial (Neo4J, FleetDB) hanyalah beberapa contoh ketika solusi NoSQL benar-benar bersinar.
IMHO, model data memiliki peran lebih penting daripada ukuran data saat mempertimbangkan solusi NoSQL atau RDBMS.
sumber
Jika basis data relasional tidak skala, tidak ada yang bisa. Jangan khawatir tentang masalah penskalaan.
SQL memiliki masalah dengan beberapa jenis analisis, tetapi tidak butuh banyak data untuk memicu masalah. Misalnya, pertimbangkan tabel tunggal dengan kolom yang mereferensikan baris lain berdasarkan kunci unik. Biasanya, ini dapat digunakan untuk membuat struktur pohon. Anda dapat menulis pernyataan SQL cepat yang merujuk pada baris terkait. Atau baris terkait yang terkait. Bahkan Anda dapat membuat jumlah lompatan tertentu. Tetapi jika, untuk setiap baris, Anda ingin memilih bidang pada baris terkait pertama dalam rantai yang memenuhi beberapa kriteria, maka itu menjadi rumit.
Pertimbangkan tabel lokasi kantor di tingkat negara, provinsi / negara bagian, kabupaten, kota, dan desa, dengan masing-masing kantor merujuk kantor yang dilaporkannya. Tidak ada jaminan bahwa kantor pelaporan masing-masing kantor hanya naik satu tingkat. Untuk kumpulan kantor yang dipilih, tidak semua di satu tingkat, Anda ingin membuat daftar kantor nasional masing-masing yang terkait. Ini membutuhkan loop statments SQL dan akan memakan waktu lama bahkan hari ini. (Dulu saya mendapatkan 30 detik pada pemilihan 30 kantor, tapi itu sudah lama sekali - dan beralih ke prosedur yang tersimpan sedikit membantu.)
Jadi alternatifnya adalah dengan meletakkan seluruh struktur ke dalam satu blok besar data, memberi label, dan menyimpannya. Saat Anda ingin menganalisis data, bacalah semuanya ke dalam memori sekaligus, tetapkan petunjuk untuk melacak struktur, dan Anda dapat memproses beberapa juta kantor dalam sekejap mata.
Semua ini tidak ada hubungannya dengan jumlah data. Kuncinya adalah sifat organisasi data. Jika tata letak relasional membantu, maka RDBMS adalah yang Anda inginkan. Jika tidak, beberapa jenis penyimpanan massal akan menjadi apa saja dari yang sedikit hingga empat kali lipat lebih cepat.
Perhatikan bahwa jika salah satu dari set data ini menjadi terlalu besar untuk masuk ke dalam memori, database non-SQL Anda tidak berfungsi lagi. Masalah lain adalah ketika Anda membutuhkan data dari lebih dari satu blok sekaligus; Anda dapat melakukan ini jika , dan hanya jika, semua blok masuk ke memori sekaligus. Dan pengguna harus menunggu saat Anda memuatnya.
Jika basis data relasional Anda akan menyebabkan masalah, itu akan dilakukan sebelum Anda memasukkan banyak data ke dalamnya. Satu-satunya masalah penskalaan yang mungkin Anda miliki adalah dengan program Anda ketika blok data yang Anda kumpulkan untuk DB nosql - jika Anda harus menggunakannya - menjadi terlalu besar untuk itu. (Jangan membaca tentang kesalahan di luar memori. Bahasa yang lebih baru terkadang melakukan hal-hal aneh dengan memori.)
sumber
Saya pikir alasan pertama untuk pergi ke solusi NoSQL atau Terdistribusi tidak begitu banyak dari semua data, tetapi ukuran tabel. Solusi terdistribusi yang dilakukan dengan baik adalah memecah tabel ke node yang berbeda maka ketika Anda perlu melakukan query tabel, setiap node akan memproses bagian tabel mereka.
RDBMS dapat melakukan ini, tetapi gelombang baru dari database NoSQL telah dibangun untuk melakukan ini. Oracle, MSSQL, MySQL mengambil model terpusat mereka dan mengubahnya untuk membuatnya berfungsi dalam lingkungan terdistribusi. Namun mereka tetap mematuhi aturan ACID yang ketat sementara beberapa database baru tidak mematuhi aturan ketat seperti dengan menggunakan konsistensi akhirnya.
Tidak ada jumlah data yang ditetapkan di mana Anda harus memilih satu di atas yang lain. Yang perlu diperhitungkan adalah kebutuhan basis data dan jumlah penggunaan yang diterimanya. Basis data NoSQL dapat memproses set data yang lebih besar dengan lebih cepat sementara basis data relasional memberi Anda kepercayaan diri bahwa data Anda benar dengan prinsip-prinsip ACID.
sumber
Mungkin juga bermanfaat untuk menyebutkan bahwa model data Anda memiliki pengaruh besar pada banyak hal. Jika Anda menemukan diri Anda perlu membuat beberapa bentuk struktur pohon (yaitu Anda memiliki kunci asing referensi sendiri pada tabel yang berisi kata kunci asing tersebut dalam kunci primer majemuk) Anda mungkin harus melihat melakukan hal itu dalam beberapa bentuk database yang menangani tipe data dengan sangat baik (seperti mongodb atau couchdb).
Seperti orang lain katakan, Anda juga harus mempertimbangkan apa yang terjadi dalam aplikasi Anda. jika Anda benar-benar membutuhkan ACID di beberapa tabel maka Anda benar-benar harus tetap menggunakan RDBMS, tetapi jika Anda memiliki sesuatu di mana Anda dapat memiliki beberapa data yang sedikit basi dan Anda memerlukan fleksibilitas skema NoSQL (sebutlah schemaless jika Anda suka, tetapi masih memiliki beberapa bentuk skema implisit) maka Anda mungkin mempertimbangkan untuk mengambil toko NoSQL ( http://www.10gen.com/customers/craigslist di sini adalah contoh mengapa craigslist beralih ... tetapi diakui mereka mengarsipkan ~ 10TB dari data, yang saya tahu tidak cocok dengan ukuran basis data Anda yang kecil hingga menengah, tetapi use case mungkin bisa membantu).
Perlu diingat bahwa sistem NoSQL tidak harus ada di sana untuk menggantikan RDMS, tetapi dalam banyak kasus Anda dapat menambah RDBMS Anda melalui gagasan Polyglot Persistence dan Anda dapat menyimpan sebagian besar data Anda dalam RDBMS tetapi dalam contoh niche khusus Anda dapat membongkar sebagian dari Anda data ke beberapa bentuk toko NoSQL.
sumber
Mongo
dapat diinstal pada sejumlah komputer / node.PostgreSQL
tidak menyediakan alat bawaan untuk sharding, namun citus ada di sekitar.MongoDB mendukung database hingga 64 terabyte dan ukuran dokumen adalah 16 megabyte.
MySQL memiliki batas basis data 256 terabyte, 64 terabyte ukuran maksimum untuk sebuah tabel dan batas rekor 4 gigabytes
PostgreSQL tidak memiliki batasan pada basis data (4 terabyte memang ada di suatu tempat untuk pengujian) dan memiliki batas 1 gigabytes untuk ukuran setiap bidang dalam tabel dan lagi 64 terabyte ukuran maksimum untuk sebuah tabel.
sumber