menembus batas impian


Jika Anda sudah membaca cukup forum yang terkait database milis atau blog Anda mungkin pernah mendengar mengeluh tentang MySQL tidak mampu menangani lebih dari 1.000.000 (atau pilih nomor lain) baris oleh beberapa pengguna. Di sisi lain hal ini juga diketahui dengan pelanggan seperti Google, Yahoo, LiveJournal, Technocarati MySQL memiliki instalasi dengan banyak miliaran baris dan memberikan performa yang hebat. Apa yang bisa menjadi alasan? Alasannya biasanya desain meja dan memahami karya batin MySQL. Jika Anda merancang data Anda dengan bijaksana mempertimbangkan apa MySQL dapat lakukan dan apa yang tidak bisa Anda akan mendapatkan kinerja besar jika tidak, Anda mungkin menjadi marah dan menjadi salah satu blogger thouse. Catatan – sistem manajemen database yang berbeda dalam beberapa hal dan apa yang bekerja dengan baik untuk Oracle, MS SQL, PostgreSQL mungkin tidak bekerja dengan baik untuk MySQL dan sebaliknya. Bahkan mesin penyimpanan memiliki perbedaan yang sangat penting yang dapat mempengaruhi kinerja secara dramatis. Tiga isu utama yang harus diperhatikan jika Anda sedang berhadapan dengan set data yang sangat besar adalah Buffer, Indeks dan Bergabung. Buffer Hal pertama yang Anda perlu mempertimbangkan adalah fakta – Situasi saat data cocok di memori dan ketika itu tidak sangat berbeda. Jika Anda mulai dari ukuran data di memori dan mengharapkan penurunan kinerja bertahap sebagai ukuran basis data tumbuh Anda mungkin akan terkejut dengan penurunan melayani dalam kinerja. Hal ini terutama apel ke lookus indeks dan bergabung yang kita membahas nanti. Seperti segala sesuatu yang biasanya memperlambat banyak sekali tidak cocok dalam memori solusi yang baik adalah untuk memastikan data Anda cocok di memori sebaik mungkin. Hal ini bisa dilakukan dengan data partisi (yaitu data lama dan jarang diakses disimpan dalam server yang berbeda), multi-server partisi menggunakan gabungan memori dan banyak lainnya teknik yang harus saya menutupi pada beberapa waktu kemudian. Jadi, Anda mengerti berapa banyak memiliki data dalam memori mengubah hal-hal di sini adalah contoh kecil dengan angka. Jika Anda memiliki data Anda sepenuhnya dalam memori Anda bisa melakukan lebih dari 300.000 dari pencarian acak per detik dari thread tunggal tergantung pada sistem dan struktur tabel. Sekarang jika Anda Data sepenuhnya pada disk (baik data dan indeks), Anda akan membutuhkan 2 + IOS untuk mengambil baris yang berarti Anda mendapatkan sekitar 100 baris / detik. Perhatikan beberapa drive tidak benar-benar banyak membantu karena kita berbicara tentang thread tunggal / query sini. Jadi perbedaan adalah 3.000 kali! Mungkin agak terlalu banyak karena ada beberapa beban kerja sepenuhnya uncached tapi 100 + kali perbedaan adalah cukup sering. Indeks Apa semua orang tahu tentang indeks adalah fakta bahwa mereka baik untuk mempercepat akses ke database. Beberapa orang juga akan ingat jika indeks membantu atau tidak tergantung pada indeks selektivitas – bagaimana sebagian besar baris sesuai dengan nilai indeks tertentu atau jangkauan. Apa yang sering dilupakan adalah tentang – tergantung jika beban kerja cache atau tidak selektivitas yang berbeda mungkin menunjukkan manfaat dari menggunakan indeks. Bahkan bahkan MySQL optimizer saat ini tidak memperhitungkannya. Untuk Dalam memori beban kerja akses indeks mungkin akan lebih cepat bahkan jika 50% dari baris yang diakses, sedangkan untuk IO disk terikat accessess kita mungkin lebih baik melakukan meja penuh memindai meskipun hanya beberapa persen atau baris yang diakses. Mari kita melakukan beberapa perhitungan lagi. Pertimbangkan tabel yang memiliki 100 baris byte. Dengan SCSI drive yang layak kita bisa mendapatkan 100MB/sec kecepatan baca yang memberi kami sekitar 1.000.000 baris per detik untuk akses sepenuhnya berurutan, selai dikemas baris – skenario sangat mungkin untuk tabel MyISAM. Sekarang jika kita mengambil hard drive yang sama untuk sepenuhnya beban kerja IO terikat akan mampu menyediakan hanya 100 baris pencarian dengan indeks pr kedua. Perbedaannya adalah 10.000 kali untuk skenario kasus buruk kami. Mungkin tidak terlalu buruk dalam praktek tapi sekali lagi itu tidak sulit untuk mencapai 100 kali perbedaan. Berikut ini adalah sedikit ilustrasi saya buat meja dengan lebih dari 30 juta baris. “Val” kolom dalam tabel ini memiliki 10000 nilai yang berbeda, sehingga rentang 1 .. 100 memilih sekitar 1% dari tabel. Waktu untuk meja penuh memindai vs rentang scan dengan indeks: Tempurung mysql> select count(pad) from large; +————+ | count(pad) | +————+ | 31457280 | +————+ 1 row in set (4 min 58.63 sec) mysql> select count(pad) from large where val between 1 and 100; +————+ | count(pad) | +————+ | 314008 | +————+ 1 row in set (29 min 53.01 sec) mysql> select count (pad) dari besar; + ———— + | count (pad) | + ———— + | 31.457.280 | + – ———- + 1 baris dalam set (4 min 58.63 sec) mysql> select count (pad) dari besar mana val antara 1 dan 100; + ———— + | count (pad) | + ———— + | 314008 | + ———— + 1 row in set (29 min 53,01 detik) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 mysql> pilih count (pad) dari besar; + ———— + | count (pad) | + ———— + | 31457280 | + ———— + 1 baris dalam mengatur (4 min 58,63 sec) mysql> pilih count (pad) dari besar mana val antara 1 dan 100; + ———— + | count (pad) | + ———— + | 314.008 | + ———— + 1 baris dalam mengatur (29 min 53,01 sec) Juga ingat – tidak semua indeks diciptakan sama. Beberapa indeks dapat ditempatkan di halaman ditempatkan di tempat-tempat acak cara diurutkan atau – hal ini dapat mempengaruhi indeks scan / rentang kecepatan scan secara dramatis. Baris direferensikan oleh indeks juga bisa ditemukan secara berurutan atau memerlukan Radom IO jika rentang indeks scan. Ada juga tombol berkerumun di InnoDB yang menggabungkan akses indeks dengan akses data, menghemat IO untuk sepenuhnya beban kerja disk yang terikat. Ada optimasi tertentu dalam karya-karya yang akan meningkatkan kinerja indeks akses / index scan. Misalnya mengambil nilai indeks pertama dan kemudian mengakses baris dalam urutan diurutkan dapat banyak bantuan untuk scan besar. Hal ini akan mengurangi kesenjangan tapi aku ragu itu akan ditutup. Bergabung Bergabung digunakan untuk menyusun obyek yang kompleks yang sebelumnya dinormalisasi ke beberapa tabel atau melakukan query kompleks menemukan hubungan antara objek. Struktur normal dan banyak bergabung adalah cara yang tepat untuk merancang database Anda sebagai buku teks mengajarkan Anda … tapi ketika berhadapan dengan data besar bisa recepie bencana. Masalahnya bukan data ukuran – Data dinormalisasi biasanya menjadi lebih kecil, tapi secara dramatis meningkatkan jumlah pencarian indeks yang bisa akses acak. Masalah ini ada untuk semua jenis aplikasi, namun untuk aplikasi OLTP dengan permintaan pemeriksaan hanya beberapa baris itu adalah kurang dari masalah. Pengambilan data, pencarian, DSS, aplikasi intelijen bisnis yang perlu menganalisa banyak baris menjalankan agregat dll adalah ketika masalah ini adalah yang paling dramatis. Beberapa bergabung juga lebih baik daripada yang lain. Misalnya jika Anda memiliki bintang bergabung dengan meja dimensi yang kecil itu tidak akan memperlambat segalanya terlalu banyak. Di sisi lain bergabung dari beberapa meja besar, yang benar-benar disk yang terikat bisa sangat lambat. Salah satu alasan mengangkat masalah ini dalam MySQL adalah kurangnya canggih bergabung metode pada saat ini (pekerjaan adalah tentang cara) – MySQL tidak bisa melakukan hash bergabung atau mengurutkan merge bergabung – hanya dapat melakukan metode loop bersarang yang membutuhkan banyak lookup indeks yang mungkin acak. Berikut ini adalah contoh yang baik. Seperti yang kita lihat baris 30mil saya (12GB) tabel-scan dalam waktu kurang dari 5 menit. Sekarang jika kita akan melakukan eq join tabel untuk lain baris tabel 30mil dan akan benar-benar acak. Kita harus melakukan 30 juta baris acak membaca, yang memberi kami 300.000 detik dengan 100 baris / tingkat sec. Jadi kita akan pergi dari 5 menit untuk hampir 4 hari jika kita perlu melakukan bergabung. Beberapa orang beranggapan bergabung akan menjadi dekat dengan dua meja penuh scan (sebagai 60mil baris perlu dibaca) – ini adalah cara yang salah. Jangan mengambil saya sebagai melawan normalisasi atau bergabung. Ini adalah prinsip yang besar dan harus digunakan bila memungkinkan. Hanya jangan lupa tentang implikasi kinerja merancang sistem dan tidak mengharapkan bergabung untuk bebas. Akhirnya saya harus menyebutkan satu lagi MySQL keterbatasan yang mengharuskan Anda untuk berhati-hati bekerja ekstra dengan set data yang besar. Dalam MySQL query tunggal berjalan sebagai single thread (dengan exeption MySQL Cluster) dan MySQL isu IO permintaan satu per satu untuk eksekusi query, yang berarti jika satu waktu eksekusi query adalah kekhawatiran Anda banyak hard drive dan sejumlah besar CPU tidak akan membantu. Kadang-kadang ide yang baik untuk secara manual dibagi menjadi beberapa permintaan, berjalan secara paralel dan agregat hasil set. Jadi jika Anda sedang berhadapan dengan set data yang besar dan pertanyaan kompleks di sini adalah beberapa tips Cobalah untuk menyesuaikan data set Anda bekerja dengan dalam memori – Pengolahan dalam memori jauh lebih cepat dan Anda memiliki seluruh banyak masalah diselesaikan hanya melakukannya. Gunakan beberapa server untuk menjadi tuan rumah bagian dari kumpulan data. Toko sebagian data Anda akan bekerja dengan dalam tabel sementara dll Memilih meja penuh scan untuk akses index – Untuk data besar set meja penuh scan seringkali lebih cepat dari kisaran scan dan jenis-jenis pencarian indeks. Bahkan jika Anda melihat 1% atau baris atau scan meja penuh kurang mungkin lebih cepat. Hindari bergabung ke tabel besar Bergabung data yang besar set menggunakan loop bersarang sangat mahal. Cobalah untuk menghindari hal itu. Bergabung ke meja kecil OK tetapi Anda mungkin ingin memuatnya ke memori sebelum bergabung sehingga tidak ada IO acak diperlukan untuk mengisi cache. Dengan arsitektur aplikasi yang tepat dan desain tabel Anda dapat membangun aplikasi yang beroperasi dengan data yang sangat besar set didasarkan pada MySQL

 

http://www.mysqlperformanceblog.com/2006/06/09/why-mysql-could-be-slow-with-large-tables/

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: