MySQL performans â € "Birden sorguları veya bir verimsiz sorgu?

3 Cevap php

I have three tables, each contain some common information, and some information that is unique to the table. For example: uid, date are universal among the tables, but one table can contain a column type while the other contains currency. I need to query the database and get the last 20 entries (date DESC) that have been entered in all three tables. My options are:

  1. Üç UNION ALL hükümler içeren, büyük bir sorgu ile bir kez veritabanını sorgulamak ve, sütunlar için sahte değerlerle birlikte IE pass:

    FROM    (
        SELECT  uid, date, currency, 0, 0, 0
    

    ve daha sonra

    FROM    (
        SELECT  uid, date, 0, type, 0, 0
    

    Bu null değerli alanlar tahsis beni bırakacaktı ..

  2. YA ben kombine son 20 Mesajları almak için bilgi yoluyla sort PHP içinde nasılsa veritabanını üç kez sorgulamak ve edebilirsiniz. (LIMIT 20) * 3'e bakmak için 60 Mesajları - - Bu bir bilgi fazlalığı ile beni terk edeceğini ve addtional quicksort çeşit her zaman preform beni zorlar.

Ne seçeneğin daha iyi / herhangi bir alternatif fikirler?

Teşekkürler.

3 Cevap

Bu iki seçenek ses yapmak daha benzer.

Eğer UNION s ile tek büyük bir sorgu gerçekleştirdiğinizde, MySQL hala sizin alternatif planı yapıyor öneriyorum gibi, üç ayrı sorguları gerçekleştirirken, ve sonra tek bir sonuç bunları birleştirerek olacaktır.

Yani, MySQL filtreleme yapalım (ve LIMIT) sizin için, ya da kendiniz yapabilirsiniz ya. MySQL tüm iş kadar tercih sesler yapmak icar, bu seçim göz önüne alındığında.

Sonuç kümesinde fazladan sütunlar olması teorik performansı engel olabilir, ama 20 satır olarak ayarlanmış çok küçük bir sonuç ile, ben herhangi bir saptanabilir etkisi için beklemek olmaz.

Bu, tüm tabloları ne kadar büyük bağlıdır. Her tablo bir kaç bin kayıtları varsa, ilk çözüm (BİRLİĞİ) ile gidebilirsiniz, ve iyi olacak.

Büyük tablolar, ben muhtemelen BİRLİĞİ şekilde daha az ressources (RAM) kullanır, çünkü çoğunlukla ikinci solüsyon ile gitmek ve hala makul hızlı olurdu.

Ama veri modeli düşünmek tavsiye, ve belki optimize olacaktır. Eğer UNION-tabanlı sorgular kullanmak zorunda gerçeği genellikle orada optimizasyonu için oda tipik bir katma "tipi" alanı ile, üç tablo birleştirerek, var (isimleri hiç iyi değil, ama benim açımdan) anlamına gelir.

Eğer sınırlarını bilmek eğer her sorgu sınırlamak ve sendika sadece küçük veriler üzerinde çalıştırabilirsiniz vardı edebilirsiniz. mysql sadece 20 satır döndürür ve php yapabilirsiniz sonra sıralama daha hızlı hale getirecek gibi bu daha iyi olmalı ...

select * from (
  SELECT  uid, date, currency, 0, 0, 0 from table_a order by date desc limit 20
  union
  SELECT  uid, date, 0, type, 0, 0  from table_b order by date desc limit 20
...
) order by date desc limit 20