MySQL vs MongoDB 1000 berbunyi


321

Saya sangat senang tentang MongoDb dan telah mengujinya akhir-akhir ini. Saya memiliki tabel yang disebut posting di MySQL dengan sekitar 20 juta catatan diindeks hanya pada bidang yang disebut 'id'.

Saya ingin membandingkan kecepatan dengan MongoDB dan saya menjalankan tes yang akan mendapatkan dan mencetak 15 catatan secara acak dari database besar kami. Saya menjalankan kueri masing-masing sekitar 1.000 kali untuk mysql dan MongoDB dan saya terkejut bahwa saya tidak melihat banyak perbedaan dalam kecepatan. Mungkin MongoDB adalah 1,1 kali lebih cepat. Itu sangat mengecewakan. Apakah ada yang salah yang saya lakukan? Saya tahu bahwa tes saya tidak sempurna tetapi MySQL setara dengan MongoDb ketika datang untuk membaca tugas-tugas intensif.


catatan:

  • Saya memiliki dual core + (2 thread) i7 cpu dan ram 4GB
  • Saya memiliki 20 partisi di MySQL masing-masing dari 1 juta catatan

Kode Sampel Digunakan Untuk Menguji MongoDB

<?php
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
$time_taken = 0;
$tries = 100;
// connect
$time_start = microtime_float();

for($i=1;$i<=$tries;$i++)
{
    $m = new Mongo();
    $db = $m->swalif;
    $cursor = $db->posts->find(array('id' => array('$in' => get_15_random_numbers())));
    foreach ($cursor as $obj)
    {
        //echo $obj["thread_title"] . "<br><Br>";
    }
}

$time_end = microtime_float();
$time_taken = $time_taken + ($time_end - $time_start);
echo $time_taken;

function get_15_random_numbers()
{
    $numbers = array();
    for($i=1;$i<=15;$i++)
    {
        $numbers[] = mt_rand(1, 20000000) ;

    }
    return $numbers;
}

?>


Contoh Kode Untuk Menguji MySQL

<?php
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
$BASE_PATH = "../src/";
include_once($BASE_PATH  . "classes/forumdb.php");

$time_taken = 0;
$tries = 100;
$time_start = microtime_float();
for($i=1;$i<=$tries;$i++)
{
    $db = new AQLDatabase();
    $sql = "select * from posts_really_big where id in (".implode(',',get_15_random_numbers()).")";
    $result = $db->executeSQL($sql);
    while ($row = mysql_fetch_array($result) )
    {
        //echo $row["thread_title"] . "<br><Br>";
    }
}
$time_end = microtime_float();
$time_taken = $time_taken + ($time_end - $time_start);
echo $time_taken;

function get_15_random_numbers()
{
    $numbers = array();
    for($i=1;$i<=15;$i++)
    {
        $numbers[] = mt_rand(1, 20000000);

    }
    return $numbers;
}
?>

11
Apa waktu yang sebenarnya?
Abe Petrillo

30
Saya bukan DBA jadi ini adalah komentar bukan jawaban, tetapi kecepatan seharusnya tidak menjadi pertimbangan utama saat memilih antara MySQL dan MongoDB. Hal-hal seperti schemaless vs schema (yaitu seberapa sering skema data Anda perlu diubah) dan penskalaan dalam ukuran (yaitu seberapa mudahnya untuk shard data Anda sehingga membaca biasa memerlukan data dari hanya satu server) lebih penting untuk pilihan seperti ini.
rossdavidh

17
Bagaimana bisa lebih cepat dalam membaca? Bunyinya dari perangkat mekanik. Sama seperti MySQL. Tergantung pada kecepatan perangkat itu sendiri, Anda tidak dapat menggunakan sihir aneh melalui kode untuk menembus batas perangkat keras.
NB

7
Pertanyaan ini hanya mengingatkan saya pada hal ini: mongodb-is-web-scale.com
oligofren

13
Orang-orang keliru bahwa mereka merasa seperti akan pergi dengan yang lain. Anda akan membutuhkan microwave dan oven di dapur Anda. Anda tidak bisa mengatakan saya hanya akan menggunakan satu atau yang lain. Kasus penggunaan untuk kedua sistem berbeda. Jika Anda memerlukan ACID untuk bagian dari aplikasi Anda, maka gunakan RDBMS, jika tidak peduli dengan konsistensi dan kendala dan entitas Anda dapat disimpan sebagai all in one (koleksi) kemudian gunakan MongoDB. Anda akan berakhir menggunakan sistem hybrid, titik kunci adalah memutuskan apa yang harus disimpan di mana.
Teoman shipahi

Jawaban:


647

MongoDB tidak secara ajaib lebih cepat. Jika Anda menyimpan data yang sama, pada dasarnya diatur dengan cara yang sama, dan mengaksesnya dengan cara yang persis sama, maka Anda benar-benar tidak boleh mengharapkan hasil Anda sangat berbeda. Bagaimanapun, MySQL dan MongoDB keduanya adalah GPL, jadi jika Mongo memiliki beberapa kode IO yang secara ajaib lebih baik di dalamnya, maka tim MySQL bisa memasukkannya ke dalam basis kode mereka.

Orang-orang melihat kinerja MongoDB dunia nyata sebagian besar karena MongoDB memungkinkan Anda melakukan kueri dengan cara berbeda yang lebih masuk akal untuk beban kerja Anda.

Misalnya, pertimbangkan desain yang menyimpan banyak informasi tentang entitas yang rumit dengan cara yang dinormalisasi. Ini bisa dengan mudah menggunakan lusinan tabel di MySQL (atau relasional db) untuk menyimpan data dalam bentuk normal, dengan banyak indeks diperlukan untuk memastikan integritas relasional antar tabel.

Sekarang pertimbangkan desain yang sama dengan toko dokumen. Jika semua tabel terkait berada di bawah tabel utama (dan memang sering terjadi), maka Anda mungkin dapat memodelkan data sedemikian rupa sehingga seluruh entitas disimpan dalam satu dokumen. Di MongoDB Anda dapat menyimpan ini sebagai dokumen tunggal, dalam satu koleksi. Di sinilah MongoDB mulai mengaktifkan kinerja yang unggul.

Di MongoDB, untuk mengambil seluruh entitas, Anda harus melakukan:

  • Satu pencarian indeks pada koleksi (dengan asumsi entitas diambil oleh id)
  • Ambil kembali isi dari satu halaman basis data (dokumen binary json yang sebenarnya)

Jadi pencarian b-tree, dan halaman biner membaca. Log (n) + 1 IO. Jika indeks dapat berada sepenuhnya dalam memori, maka 1 IO.

Di MySQL dengan 20 tabel, Anda harus melakukan:

  • Satu pencarian indeks pada tabel root (sekali lagi, dengan asumsi entitas diambil oleh id)
  • Dengan indeks berkerumun, kita dapat mengasumsikan bahwa nilai-nilai untuk baris root ada dalam indeks
  • 20+ rentang pencarian (mudah-mudahan di indeks) untuk nilai pk entitas
  • Ini mungkin bukan indeks yang dikelompokkan, jadi pencarian 20+ data yang sama setelah kami mencari tahu apa baris anak yang sesuai.

Jadi total untuk mysql, bahkan dengan asumsi bahwa semua indeks ada dalam memori (yang lebih sulit karena ada 20 kali lebih banyak dari mereka) adalah sekitar 20 rentang pencarian.

Pencarian rentang ini kemungkinan terdiri dari IO acak - tabel yang berbeda pasti akan berada di tempat yang berbeda pada disk, dan mungkin baris berbeda dalam rentang yang sama dalam tabel yang sama untuk suatu entitas mungkin tidak berdekatan (tergantung pada bagaimana entitas telah diperbarui, dll).

Jadi untuk contoh ini, penghitungan akhir adalah sekitar 20 kali lebih banyak IO dengan MySQL per akses logis, dibandingkan dengan MongoDB.

Inilah bagaimana MongoDB dapat meningkatkan kinerja dalam beberapa kasus penggunaan .


43
bagaimana jika kita hanya meletakkan satu tabel utama di mysql?
ariso

99
@ariso: Ini adalah pengoptimalan berdasarkan denormalisasi. Ini dapat memberikan peningkatan kinerja. Namun, jika Anda melakukan ini, maka Anda membuang desain bersih Anda, dan semua kekuatan (belum lagi sebagian besar fitur) dari database relasional. Dan itu hanya benar-benar berfungsi sampai Anda mencapai batas kolom.
Sean Reilly

7
@SeanReilly Contoh Anda dengan entitas (harus diedit dengan objek, tidak ada pemrograman berorientasi entitas :)) tidak valid. Seperti yang dikatakan ariso, Anda bisa membuat serial objek dan menyimpannya di db dan membatalkan deserialisasi saat diperlukan (segala bentuk serialisasi). Kekuatan sebenarnya dari objek yang bertahan ada dalam oodbms bukan sistem documnet db. Tetapi saya setuju bahwa masing-masing memiliki tujuan dan kekuatan sendiri (tetapi contoh Anda lebih mengaburkan visi dan relevansi topik ini).
Geo C.

9
20 bergabung, saya akan mengatakan, kemungkinan besar bukan permintaan terbaik pada skema database terbaik ini mungkin.
Audrius Meskauskas

8
@SeanReilly Saya menemukan contoh Anda sangat membantu. Anda bisa membangun antarmuka khusus untuk MySQL yang secara otomatis membuat serial dan deserializes objek ke tabel dan berperilaku seperti mongodb. Namun, mengapa tidak hanya menggunakan sesuatu yang dirancang khusus untuk digunakan seperti itu? Juga penggunaan "entitas" Anda juga masuk akal. Intinya adalah bahwa Anda mengatur data sebagai dokumen, bukan sebagai bidang dalam tabel. Apakah dokumen tersebut merupakan objek yang dikomposisikan dalam bahasa OO tidak relevan dengan contoh.
BHS

57

Apakah Anda memiliki konkurensi, yaitu pengguna simultan? Jika Anda hanya menjalankan 1000 kali kueri langsung, hanya dengan satu utas, hampir tidak ada perbedaan. Terlalu mudah untuk mesin ini :)

TETAPI saya sangat menyarankan Anda membangun sesi pengujian beban yang sebenarnya, yang berarti menggunakan injector seperti JMeter dengan 10, 20 atau 50 pengguna PADA SAAT YANG SAMA sehingga Anda benar-benar dapat melihat perbedaan (cobalah untuk menanamkan kode ini di dalam halaman web JMeter dapat meminta).

Saya baru saja melakukannya hari ini di satu server (dan koleksi / tabel sederhana) dan hasilnya cukup menarik dan mengejutkan (MongoDb benar-benar lebih cepat dalam menulis & membaca, dibandingkan dengan mesin MyISAM dan mesin InnoDb).

Ini benar-benar harus menjadi bagian dari pengujian Anda: concurrency & mesin MySQL. Kemudian, desain data / skema & kebutuhan aplikasi tentu saja persyaratan yang sangat besar, di luar waktu respons. Beri tahu saya ketika Anda mendapatkan hasil, saya juga membutuhkan masukan tentang ini!


42
Bisakah Anda membagikan hasil Anda?
Imran Omar Bukhsh

1
Ya, hasilnya akan sangat membantu
Vasil Popov

3
Tentunya ini hanya akan skala ... jika itu adalah Apel untuk Apel seperti yang telah mereka katakan di sisa topik ini. Jadi jika pada avg berkinerja x, sekarang disimulasikan dari berbagai sumber, tolong jelaskan mengapa mongo akan lebih cepat. Yaitu katakan saja demi persetujuan bahwa mysql berada di rata-rata lebih cepat untuk permintaan tunggal ... mengapa mongo sekarang menjadi lebih cepat untuk beberapa? Saya tidak menemukan ini sangat ilmiah. Saya mengatakan tes ini valid .. tetapi tidak begitu yakin tentang bagaimana perbedaannya akan sangat besar jika Anda membandingkan Apel dengan Apel seperti yang dijelaskan dalam topik lainnya.
Seabizkit

35

Sumber: https://github.com/webcaetano/mongo-mysql

10 baris

mysql insert: 1702ms
mysql select: 11ms

mongo insert: 47ms
mongo select: 12ms

100 baris

mysql insert: 8171ms
mysql select: 10ms

mongo insert: 167ms
mongo select: 60ms

1000 baris

mysql insert: 94813ms (1.58 minutes)
mysql select: 13ms

mongo insert: 1013ms
mongo select: 677ms

10.000 baris

mysql insert: 924695ms (15.41 minutes)
mysql select: 144ms

mongo insert: 9956ms (9.95 seconds)
mongo select: 4539ms (4.539 seconds)

91
15 mnt untuk memasukkan 10.000 baris? Itu adalah database MySQL yang sangat anemia. Dalam pengalaman saya, jika operasi seperti itu mendekati 1s dalam durasi, ponsel saya menyala dengan keluhan. :)
Mordechai

1
Xtreme Biker lihat tautannya. Saya memposting tes dari orang lain dengan pengaturan lain.
user2081518

14
Beberapa poin: 1) Mysql perlu dioptimalkan dan dikonfigurasikan dengan benar, ada banyak cara berbeda untuk menyisipkan data dalam jumlah besar, dan jika dilakukan dengan benar dibutuhkan 0,1% dari 15 menit, lihat halaman ini sebagai contoh. 2) MongoDB tidak langsung menulis data ke disk karena itu "terlihat" lebih cepat, tetapi jika komputer Anda crash, data tersebut hilang. 3) Membaca jauh lebih cepat di MySQL
elipoultorak

81
15 mnt untuk 10.000 baris? Anda mengetik setiap baris? =))))
Iurie Manea

7
siapa pun yang meyakini klaim bahwa dibutuhkan 1,7 detik untuk memasukkan sepuluh baris ke dalam mysql layak mendapatkan rasa sakit yang mereka dapatkan dari mongo
John Haugeland

20

man ,,, jawabannya adalah bahwa Anda pada dasarnya menguji PHP dan bukan database.

jangan repot-repot mengulangi hasilnya, apakah mengomentari hasil cetak atau tidak. ada banyak waktu.

   foreach ($cursor as $obj)
    {
        //echo $obj["thread_title"] . "<br><Br>";
    }

sementara potongan lainnya dihabiskan untuk mengumpulkan banyak nomor rand.

function get_15_random_numbers()
{
    $numbers = array();
    for($i=1;$i<=15;$i++)
    {
        $numbers[] = mt_rand(1, 20000000) ;

    }
    return $numbers;
}

maka ada perbedaan besar b / w meledak dan

dan akhirnya apa yang terjadi di sini. sepertinya membuat koneksi setiap kali, jadi ini menguji waktu koneksi ditambah waktu permintaan.

$m = new Mongo();

vs.

$db = new AQLDatabase();

jadi 101% Anda lebih cepat bisa berubah menjadi 1000% lebih cepat untuk kueri jazz yang mendasarinya.

urghhh


4
secara alami, praktik pengkodean dapat membuat perbedaan besar dalam situasi apa pun, tetapi ini tidak spesifik untuk semua jenis bahasa, api, atau ekstensi. menghasilkan angka acak sebelum memulai timer akan membuat perbedaan, tetapi sebagian besar waktu dalam proses tidak diragukan lagi dari transaksi basis data. pembuatan angka acak itu sepele, basis data SQL dan NoSQL tidak.
JSON

1
jangan memilih nomor rand. jelas Anda melewatkan koneksi pembuatan setiap kali. semua masalah ditambahkan hingga menguji sesuatu selain yang dimaksudkan.
Gabe Rainbow

2
Tidak, tidak ketinggalan. MySQL tidak akan menutup koneksi sampai script selesai kecuali mysqli_close () dipanggil. Jika tidak, ulangi panggilan ke mysqli_connect () hanya akan menarik sumber daya mysql yang ada dari tabel sumber daya saat ini, daripada melakukan prosedur koneksi baru. Saya tidak begitu yakin apa objek AQLDatabase itu, tetapi jika ia menggunakan mysql lib (yang sepertinya) ia akan memiliki perilaku yang sama. Ekstensi MongoDB menggunakan penyatuan koneksi, jadi hal dasar yang sama terjadi ketika membuat 'koneksi' mongodb lebih dari sekali dalam sebuah skrip.
JSON

Saya setuju bahwa tolok ukurnya bisa dilakukan secara berbeda, tetapi mencerminkan hasil dasar yang sama dengan bangku MySQL vs Mongo lain yang pernah saya lihat. Mongo biasanya lebih cepat saat memasukkan (jauh lebih cepat untuk menyisipkan lebih sederhana) dan MySQL biasanya lebih cepat saat memilih.
JSON

harus diakui, saya terlalu masam; itu adalah senar html string "<br>" yang benar-benar 'mendesak' saya. Anda tidak perlu cukup mencetak dalam tes. bahkan iterasi tampaknya seperti tes php dan bukan tes basis data. secara keseluruhan, momen AQLDatabase 'mungkin / mungkin' ... lebih banyak bahan berarti lebih banyak yang tidak diketahui.
Gabe Rainbow

17

https://github.com/reoxey/benchmark

patokan

perbandingan kecepatan MySQL & MongoDB di GOLANG1.6 & PHP5

sistem yang digunakan untuk benchmark: DELL cpu i5 4th gen 1.70Ghz * 4 ram 4GB GPU ram 2GB

Perbandingan kecepatan RDBMS vs NoSQL untuk INSERT, SELECT, UPDATE, DELETE yang mengeksekusi jumlah baris yang berbeda 10.100,1000,10000,100000,100000000

Bahasa yang digunakan untuk mengeksekusi adalah: PHP5 & Google tercepat bahasa GO 1.6

________________________________________________
GOLANG with MySQL (engine = MyISAM)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            INSERT
------------------------------------------------
num of rows             time taken
------------------------------------------------
10                      1.195444ms
100                     6.075053ms
1000                    47.439699ms
10000                   483.999809ms
100000                  4.707089053s
1000000                 49.067407174s


            SELECT
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 872.709µs


        SELECT & DISPLAY
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 20.717354746s


            UPDATE
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 2.309209968s
100000                  257.411502ms
10000                   26.73954ms
1000                    3.483926ms
100                     915.17µs
10                      650.166µs


            DELETE
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 6.065949ms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


________________________________________________
GOLANG with MongoDB
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            INSERT
------------------------------------------------
num of rows             time taken
------------------------------------------------
10                      2.067094ms
100                     8.841597ms
1000                    106.491732ms
10000                   998.225023ms
100000                  8.98172825s
1000000                 1m 29.63203158s


            SELECT
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 5.251337439s


        FIND & DISPLAY (with index declared)
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 21.540603252s


            UPDATE
------------------------------------------------
num of rows             time taken
------------------------------------------------
1                       1.330954ms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

________________________________________________
PHP5 with MySQL (engine = MyISAM)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            INSERT
------------------------------------------------
num of rows             time taken
------------------------------------------------
 10                     0.0040680000000001s
 100                    0.011595s
 1000                   0.049718s
 10000                  0.457164s
 100000                 4s
 1000000                42s


            SELECT
------------------------------------------------
num of rows             time taken
------------------------------------------------
 1000000                <1s


            SELECT & DISPLAY
------------------------------------------------
num of rows             time taken
------------------------------------------------
  1000000               20s
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

________________________________________________
PHP5 with MongoDB 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            INSERT
------------------------------------------------
num of rows             time taken
------------------------------------------------
10                      0.065744s
100                     0.190966s
1000                    0.2163s
10000                   1s
100000                  8s
1000000                 78s


            FIND
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 <1s


            FIND & DISPLAY
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 7s


            UPDATE
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 9s

myisam bukan innodb, juga versi mongodb dan mesin penyimpanan mana?

1
penting untuk menentukan versi MySQL dan MongoDB.
Miron

1
Jangan gunakan MyISAM. Gunakan sisipan batched!
Rick James

MySQL lebih cepat dari Mongodb di Sisipkan kueri ?! sepertinya tidak benar sampai mysql perlu menyiapkan kolom dan hubungan ulang. mysql select lebih cepat dari mongodb select, tetapi dalam query insert, mongo lebih cepat
Exind

6

Berikut adalah sedikit riset yang mengeksplorasi RDBMS vs NoSQL menggunakan MySQL vs Mongo, kesimpulannya sejalan dengan tanggapan @Sean Reilly. Singkatnya, manfaat berasal dari desain, bukan perbedaan kecepatan mentah. Kesimpulan di halaman 35-36:

RDBMS vs NoSQL: Perbandingan Kinerja dan Skala

Proyek ini menguji, menganalisis, dan membandingkan kinerja dan skalabilitas kedua tipe database. Eksperimen yang dilakukan termasuk menjalankan jumlah dan jenis kueri yang berbeda, beberapa lebih kompleks daripada yang lain, untuk menganalisis bagaimana database ditingkatkan dengan peningkatan beban. Faktor yang paling penting dalam kasus ini adalah tipe kueri yang digunakan karena MongoDB dapat menangani kueri yang lebih kompleks lebih cepat terutama karena skema yang lebih sederhana dengan mengorbankan duplikasi data yang berarti bahwa basis data NoSQL mungkin berisi duplikat data dalam jumlah besar. Meskipun skema yang secara langsung dimigrasikan dari RDBMS dapat digunakan, ini akan menghilangkan keuntungan dari representasi data yang mendasari MongoDB dari subdocument yang memungkinkan penggunaan kueri yang lebih sedikit ke database ketika tabel digabungkan.Terlepas dari perolehan kinerja yang dimiliki MongoDB dibandingkan MySQL dalam kueri kompleks ini, ketika benchmark memodelkan kueri MySQL mirip dengan kueri kompleks MongoDB dengan menggunakan SELECT bersarang, MySQL tampil paling baik meskipun pada jumlah koneksi yang lebih tinggi keduanya berperilaku sama. Jenis terakhir dari permintaan yang diperbandingkan yang merupakan permintaan kompleks yang mengandung dua GABUNGAN dan dan sebuah subquery menunjukkan keunggulan yang dimiliki MongoDB dibandingkan MySQL karena penggunaan subdokumen. Keuntungan ini datang pada biaya duplikasi data yang menyebabkan peningkatan ukuran basis data. Jika pertanyaan seperti itu khas dalam suatu aplikasi maka penting untuk mempertimbangkan basis data NoSQL sebagai alternatif sambil memperhitungkan biaya penyimpanan dan ukuran memori yang dihasilkan dari ukuran basis data yang lebih besar.


-6

Pada Server Tunggal, MongoDb tidak akan lebih cepat dari mysql MyISAM pada saat membaca dan menulis, mengingat ukuran tabel / dokumen kecil 1 GB hingga 20 GB.
MonoDB akan lebih cepat pada Reduksi Paralel pada kluster Multi-Node, di mana Mysql TIDAK dapat skala secara horizontal.


5
Bisakah Anda memberikan beberapa bukti atau lebih detail untuk mendukungnya?
Steve Westbrook

Tidak dapat menskala secara horizontal? Bagaimana dengan NDB? DRBD yang didukung MySQL?
Ernestas

Ini tidak benar. MongoDB memiliki batas dokumen 16MD. Mysql dapat memiliki lebih banyak jika Anda suka
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.