Pada ukuran data apa yang bermanfaat untuk beralih dari SQL ke NoSQL?

24

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).

wobbily_col
sumber
4
Anda mungkin tidak boleh bekerja dengan asumsi bahwa MySQL adalah batas atas untuk jumlah baris yang dapat ditangani oleh basis data relasional. Anda benar-benar mengajukan dua pertanyaan: Kapan MySQL kehabisan string? dan Apa batas kapasitas SQL RDBMS? Yang mana yang ingin Anda jawab?
Blrfl

Jawaban:

13

Seberapa besar data?

Ada dua ambang batas yang signifikan:

  1. seluruh data cocok dengan RAM
  2. seluruh data indeks cocok dengan RAM

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.

vartec
sumber
9
Oracle, PostgreSQL, MySQL, MS SQL Server dan Sybase semuanya mampu melakukan penggabungan antar tabel pada server jarak jauh tanpa klien harus melakukan pekerjaan apa pun.
Blrfl
4
Tentang "seluruh data dalam RAM" keberatan bahwa ini adalah tentang set kerja yang sebenarnya. Seringkali database lebih besar dari memori, tetapi sebagian besar jarang diakses, karena pada disk tidak terlalu buruk selama indeks dan sering mengambil baris dll berada dalam memori
johannes
2
@vartec Jadi Anda ingin mengirim email saya yang berumur 2 tahun dari basis data email saya karena saya mencari hanya sekali sebulan, sedangkan perangkat kerja utama saya adalah sepuluh email terakhir saja?
johannes
3
@wobbily_col petunjuk: tidak. kecuali jika Anda tidak peduli dengan konsistensi, keandalan atau daya tahan. dalam hal ini, Anda dapat mematikan banyak hal yang membuat satu jauh lebih cepat daripada yang lain, atau sebaliknya jika Anda mau. tebak apa konfigurasi default pada masing-masing? (tentu saja, MySQL juga bukan puncak dari keamanan data ...)
Javier
1
@ vartec "Sharding otomatis" bagus, di mana itu berlaku. Tapi tiba-tiba Anda tidak dapat menggabungkan semua data bersama lagi - oh tunggu, Anda tidak bisa benar-benar melakukannya dengan database dokumen juga mencari melalui semua data atau membuat laporan menjadi membosankan ... ya database dokumen ada di tempatnya, ketika model data dan operasi cocok, sama untuk sistem lain ... jumlah data saja bukan faktor (saya tahu cukup contoh MySQL berjalan dengan data di wilayah terabyte berhasil ... dan proyek dengan beberapa ratus MB gagal)
johannes
13

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.

Chiron
sumber
9
Persis. semua ini "big data" bla bla omong kosong adalah pemasaran berbicara dan seluruh "NoSQL untuk data besar!" barang juga. NoSQL bagus untuk set data besar karena lebih cepat daripada RDBMS tradisional, tetapi lebih cepat karena pengorbanan fitur yang besar. Banyak model data yang akan menderita secara signifikan karena pertukaran tersebut sementara beberapa akan berfungsi ok. Ini masalah mengetahui apa yang Anda kehilangan ketika Anda pergi ke NoSQL dan hanya menggunakan NoSQL untuk data yang dapat menderita kerugian seperti itu.
Jimmy Hoffa
1
Meskipun benar, itu bukan jawaban untuk pertanyaan yang diajukan.
vartec
Ini bukan hanya BUKAN jawabannya, tetapi juga BUKAN benar. Anda bisa membuat dokumen seperti tabel dalam database SQL hanya menggunakan tipe data JSON dan membuat database SQL bersinar di atas NoSQL.
Yevgeniy Afanasyev
6

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.)

RalphChapin
sumber
0

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.

DFord
sumber
0

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.

Harageth
sumber
0

Mongodapat diinstal pada sejumlah komputer / node. PostgreSQLtidak 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.

Yevgeniy Afanasyev
sumber