Kapan harus menggunakan tampilan di MySQL?

54

Saat membuat tabel dari beberapa gabungan untuk digunakan dalam analisis, kapan lebih disukai menggunakan tampilan dibandingkan membuat tabel baru?

Salah satu alasan mengapa saya lebih suka menggunakan view adalah bahwa skema database telah dikembangkan oleh administrator kami dari dalam Ruby, dan saya tidak terbiasa dengan Ruby. Saya dapat meminta agar tabel dibuat, tetapi membutuhkan langkah tambahan dan saya ingin lebih banyak fleksibilitas saat mengembangkan / menguji bergabung baru.

Saya mulai menggunakan pandangan mengikuti jawaban untuk pertanyaan terkait pada SO ( Kapan menggunakan R, kapan harus menggunakan SQL ). Jawaban terpilih mulai "lakukan manipulasi data dalam SQL sampai data berada dalam satu tabel, dan kemudian lakukan sisanya di R."

Saya sudah mulai menggunakan tampilan, tetapi saya mengalami beberapa masalah dengan tampilan:

  1. pertanyaan jauh lebih lambat
  2. Tampilan tidak dibuang dari produksi ke cadangan basis data yang saya gunakan untuk analisis.

Apakah pandangan sesuai untuk penggunaan ini? Jika demikian, haruskah saya mengharapkan penalti kinerja? Apakah ada cara untuk mempercepat permintaan pada tampilan?

David LeBauer
sumber
Kedengarannya seperti tampilan yang sesuai di sini, tapi saya tidak yakin apa yang bisa menyebabkan perlambatan saat menanyakannya.
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner apakah ada diagnostik yang akan membantu (singkat membuat contoh yang direproduksi)? Kueri kompleks yang sama mengambil <4d bila dilakukan secara langsung pada tabel yang bergabung dan> 25d saat dilakukan pada tampilan. Apakah pandangan diharapkan tidak memiliki penalti kinerja?
David LeBauer
Sudah lama sejak saya menggunakan MySQL jadi saya tidak bisa mengatakannya.
FrustratedWithFormsDesigner
Saya menggunakan MySQL dan saya akan memberi tahu Anda bahwa pandangannya mengerikan, tidak dapat digunakan ketika Anda mencapai 100K ke atas, cukup gunakan pertanyaan langsung di mana Anda memiliki kendali atas bidang apa yang akan dikembalikan dan apa yang bergabung untuk digunakan
Stephen Senkomago Musoke

Jawaban:

43

Tampilan di MySQL ditangani menggunakan salah satu dari dua algoritma yang berbeda: MERGEatau TEMPTABLE. MERGEhanyalah perluasan permintaan dengan alias yang sesuai. TEMPTABLEhanya seperti apa kedengarannya, tampilan menempatkan hasilnya ke tabel sementara sebelum menjalankan klausa WHERE, dan tidak ada indeks di atasnya.

Opsi 'ketiga' adalah UNDEFINED, yang memberitahu MySQL untuk memilih algoritma yang sesuai. MySQL akan berusaha menggunakannya MERGEkarena lebih efisien. Peringatan Utama:

Jika algoritma MERGE tidak dapat digunakan, tabel sementara harus digunakan sebagai gantinya. MERGE tidak dapat digunakan jika tampilan berisi salah satu dari konstruksi berikut:

  • Fungsi agregat (SUM (), MIN (), MAX (), COUNT (), dan sebagainya)

  • BERBEDA

  • KELOMPOK OLEH

  • MEMILIKI

  • MEMBATASI

  • UNION atau UNION ALL

  • Subquery dalam daftar pilih

  • Mengacu hanya pada nilai literal (dalam hal ini, tidak ada tabel yang mendasarinya)

[src]

Saya berani menebak VIEWS Anda membutuhkan algoritma TEMPTABLE, menyebabkan masalah kinerja.

Berikut ini adalah posting blog yang sangat tua tentang kinerja tampilan di MySQL dan tampaknya tidak menjadi lebih baik.

Namun, mungkin ada sedikit cahaya di ujung terowongan tentang masalah tabel sementara ini yang tidak mengandung indeks (menyebabkan pemindaian tabel penuh). Dalam 5.6 :

Untuk kasus saat materialisasi diperlukan untuk subquery dalam klausa FROM, optimizer dapat mempercepat akses ke hasil dengan menambahkan indeks ke tabel terwujud. ... Setelah menambahkan indeks, pengoptimal dapat memperlakukan tabel turunan terwujud sama dengan tabel biasa dengan indeks, dan manfaatnya sama dari indeks yang dihasilkan. Overhead pembuatan indeks diabaikan dibandingkan dengan biaya eksekusi permintaan tanpa indeks.

Seperti yang ditunjukkan @ypercube, MariaDB 5.3 telah menambahkan optimisasi yang sama. Artikel ini memiliki ikhtisar proses yang menarik:

Optimasi diterapkan maka tabel turunan tidak dapat digabungkan ke dalam induknya SELECT yang terjadi ketika tabel turunan tidak memenuhi kriteria untuk digabung. LIHAT

Derek Downey
sumber
Saya tidak melakukan pengujian pada klaim ini tetapi MariaDB 5.3 (baru-baru ini dirilis sebagai stabil) memiliki beberapa perbaikan besar pada pengoptimal, termasuk Views :Fields of merge-able views and derived tables are involved now in all optimizations employing equalities
ypercubeᵀᴹ
@ypercube terima kasih atas tautannya ... tampaknya MySQL 5.6 setidaknya memiliki optimasi untuk menambahkan indeks ke tabel turunan.
Derek Downey
14

Tampilan adalah alat keamanan. Anda tidak ingin pengguna atau aplikasi tertentu tahu di mana tabel data Anda, Anda memberikan tampilan hanya dengan kolom yang dibutuhkan.

Ingat bahwa pandangan selalu menurunkan kinerja, pertanyaan serupa harus disimpan prosedur dan fungsi, bukan tampilan.

Untuk membuat penyetelan kueri, selalu ikuti praktik terbaik, hindari menggunakan fungsi dalam klausa WHERE, buat indeks untuk mempercepat pemilihan, tetapi jangan menyalahgunakannya indeks menurunkan sisipan, pembaruan, dan penghapusan.

Ada dokumentasi bagus yang dapat membantu Anda: http://www.toadworld.com/LinkClick.aspx?fileticket=3qbwCnzY/0A=&tabid=234

Rainier Morilla
sumber
5
Saya tidak setuju bahwa pandangan adalah (hanya) alat keamanan. Mereka dapat digunakan dengan cara itu, tetapi kami menggunakannya untuk menghapus kompleksitas dalam kueri yang digunakan pengembang laporan kami secara teratur.
JHFB
2
@ JHFB: Saya setuju dengan Anda, tapi mungkin itu hanya cara kerjanya di MySQL yang kedengarannya seperti melihat hukuman kinerja serius?
FrustratedWithFormsDesigner
@frustratedwithformsdesigner poin bagus - sudah lama sejak saya menggunakan MySQL.
JHFB
1
@JHFB dilihat di Mysql adalah masalah besar! mysqlperformanceblog.com/2007/08/12/...
Rainier Morilla
2
@RainierMorilla Views menurunkan kinerja !! ??
Suhail Gupta
-2

i think views adalah struktur yang sudah ditentukan sebelumnya (tidak ada data) untuk menggabungkan tabel menjadi satu untuk diatasi dari beberapa tabel query, yang dapat digunakan dari data nyata untuk ...

Shahzad Shaikh
sumber
2
Tidak terlalu jelas poin apa yang ingin Anda sampaikan dan bagaimana hal itu mengatasi masalah yang ada di pos asli. Anda mungkin ingin membaca kembali pertanyaannya, tetapi dalam hal apa pun silakan pertimbangkan untuk memperluas jawaban Anda agar lebih jelas bagaimana hal itu dapat diterapkan pada masalah OP.
Andriy M