MySQL'de görünümler ne zaman kullanılır?


54

Analizde kullanılmak üzere birden fazla birleşimden tablolar oluştururken, görünümleri yeni bir tablo oluşturmak yerine kullanmak ne zaman tercih edilir?

Görünümleri kullanmayı tercih etmemin bir nedeni, veritabanı şemasının yöneticimiz tarafından Ruby içinden geliştirildiğinden ve Ruby'ye aşina olmamamdır. Tabloların oluşturulmasını talep edebilirim, ancak ek bir adım gerektirir ve yeni bağlantılar geliştirirken / test ederken daha fazla esneklik istiyorum.

SO ile ilgili bir sorunun cevabını izleyen görünümleri kullanmaya başladım (ne zaman R, ne zaman SQL kullanılır ). En çok oy alan cevap başlıyor "veri tek bir tabloya gelinceye kadar SQL'deki veri manipülasyonlarını yapın ve gerisini R" de yapın. "

Görünümleri kullanmaya başladım, ancak görünümlerle ilgili birkaç sorunla karşılaştım:

  1. sorgular çok daha yavaş
  2. Üretimden, analiz için kullandığım yedekleme veritabanına atılmıyor.

Görünümler bu kullanım için uygun mu? Eğer öyleyse, performans cezası beklemeli miyim? Görünümlerle ilgili sorguları hızlandırmanın bir yolu var mı?


Burada görüşlerin uygun olduğu anlaşılıyor, ancak sorgulamada yavaşlamaya neyin sebep olabileceğinden emin değilim.
SinirliFormsDesigner ile

@FrustratedWithFormsDesigner, yardımcı olabilecek herhangi bir tanılama var mı (çoğaltılabilir bir örnek oluşturmaktan kaçınıyor)? Aynı karmaşık sorgu, doğrudan birleştirilmiş masalarda <4 s, görünümlerde ise> 25 s. Görüşlerin performans cezası olmaması bekleniyor mu?
David LeBauer

MySQL kullandığımdan bu yana çok zaman geçti, bu yüzden gerçekten söyleyemem.
SinirliFormsDesigner ile

MySQL kullanıyorum ve 100K ve üstü seviyelere ulaştığınızda görüşlerin korkunç, kullanışsız olduğunu, yalnızca hangi alanları kullanacağınızı ve hangi birleşimlerin kullanılacağını kontrol ettiğiniz düz sorgular kullanacağınızı
söyleyeceğim

Yanıtlar:


43

MySQL'deki görünümler iki farklı algoritmadan biri kullanılarak ele alınır: MERGEveya TEMPTABLE. MERGEbasitçe uygun takma adlarla bir sorgu genişletme TEMPTABLEgöründüğü gibi, görünüm WHERE yan tümcesini çalıştırmadan önce sonuçları geçici bir tabloya yerleştiriyor ve üzerinde dizin yok.

'Üçüncü' seçeneği, UNDEFINEDMySQL'e uygun algoritmayı seçmesini söyler. MySQL kullanmaya çalışacak MERGEçünkü daha verimli. Ana ihtar:

MERGE algoritması kullanılamıyorsa, bunun yerine geçici bir tablo kullanılmalıdır. Görünüm aşağıdaki yapılardan birini içeriyorsa MERGE kullanılamaz:

  • Toplama işlevleri (SUM (), MIN (), MAX (), COUNT () vb.)

  • DISTINCT

  • GRUP TARAFINDAN

  • HAVING

  • SINIR

  • BİRLİK veya BİRLİK TÜMÜ

  • Seçim listesindeki alt sorgu

  • Yalnızca değişmez değerleri ifade eder (bu durumda, altta yatan tablo yoktur)

[Src]

VIEWS'iniz TEMPTABLE algoritmasını gerektirdiğini ve performans sorunlarına neden olduğunu tahmin ediyorum.

İşte MySQL'deki görüşlerin performansıyla ilgili gerçekten eski bir blog yazısı ve daha iyi anlaşılmadığı görülüyor.

Bununla birlikte, tünelin sonunda, indeks içermeyen (tam tablo taramalarına neden olan) geçici tablolar konusuna biraz ışık olabilir. In 5.6 :

FROM yan tümcesinde bir alt sorgu için materyalizasyon gerektiğinde, optimizer materyalize tablosuna bir dizin ekleyerek sonuca erişimi hızlandırabilir. ... Dizini ekledikten sonra, en iyi duruma getirici, maddileştirilmiş türetilmiş tabloyu, bir dizin içeren normal bir tabloyla aynı şekilde işlemden geçirebilir ve oluşturulan dizinden benzer şekilde yararlanır. Dizin oluşturmanın ek yükü, dizin olmadan sorgu yürütme maliyetine kıyasla önemsizdir.

@Ypercube işaret ettiği gibi, MariaDB 5.3 aynı optimizasyon ekledi. Bu makalede süreçle ilgili ilginç bir genel bakış var:

Optimizasyon uygulandıktan sonra türetilmiş tablo, birleştirilmiş VIEW için ölçütlere uymadığında ortaya çıkan, SELECT ana parametresine birleştirilemedi.


Bu iddialar üzerinde hiçbir test yapmadım, ancak MariaDB 5.3 (yakın zamanda kararlı olarak yayımlandı), Görünüm dahil olmak üzere optimize edici üzerinde bazı önemli iyileştirmeler yaptı :Fields of merge-able views and derived tables are involved now in all optimizations employing equalities
ypercubeᵀᴹ

@ypercube bu link için teşekkürler ... görünüşe göre MySQL 5.6 en azından türetilmiş tablolara indeks ekleme optimizasyonuna sahip.
Derek Downey

14

Görüşler güvenlik araçlarıdır. Belirli bir kullanıcının veya uygulamanın veri tablonuzun nerede olduğunu bilmesini istemiyorsanız, yalnızca ihtiyaç duyduğu sütunları içeren bir görünüm sağlar.

Görünümlerin performansı her zaman azalttığını unutmayın; benzer sorgular görünümler değil, saklı yordamlar ve işlevler olmalıdır.

Bir sorgu ayarlaması yapmak için her zaman en iyi uygulamaları takip edin, WHERE yan tümcelerinde işlev kullanmaktan kaçının, seçimleri hızlandırmak için dizinler oluşturun, ancak kötüye kullanmayın; bozulan ekleri, güncellemeleri ve silmeyi endeksler.

Size yardımcı olabilecek iyi belgeler var: http://www.toadworld.com/LinkClick.aspx?fileticket=3qbwCnzY/0A=&tabid=234


5
Görüşlerin (yalnızca) güvenlik aracı olduğuna katılmıyorum. Bu şekilde kullanılabilirler, ancak bunları rapor geliştiricilerin düzenli olarak kullandıkları sorgulardaki karmaşıklığı gidermek için kullanıyoruz.
JHFB

2
@JHFB: Seninle aynı fikirdeyim, ama belki de sadece MySQL'de çalıştığı gibi göründüğü gibi görünüyor.
SinirliFormsDesigner ile

@frustratedwithformsdesigner harika bir nokta - bir süredir MySQL kullandım.
JHFB

1
Mysql @ JHFB görünümleri büyük bir problemdir! mysqlperformanceblog.com/2007/08/12/…
Rainier Morilla

2
@RainierMorilla Görüntüleme performansı düşüyor !! ??
Suhail Gupta,

-2

Bence görünümler, birden fazla tablo sorgusunun üstesinden gelmek için tabloları bir araya getirmek için önceden tanımlanmış yapıdır (veri yok), hızlı ilişkisel sorgulama için gerçek verilerden kullanılabilir ...


2
Hangi noktaya değinmeye çalıştığınız ve bunun asıl gönderide ortaya konan konulara nasıl değindiği açık değildir. Soruyu tekrar okumak isteyebilirsiniz, ancak her durumda, OP'nin sorununa nasıl uygulanabileceğini daha açık hale getirmek için lütfen cevabınızı genişletmeyi düşünün.
Andriy M
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.