MySQL optimize edilmiş açıklama

Günlük MYSQL optimizasyonunda sık sık böyle bir anahtar kelime görüyoruz: açıklamak, Örneğin:

SEÇİMİ AÇIKLAYIN * Cloud_Order NEREDE para > 10;

Açıklamak nedir? MySQL'in SQL ifadenizi nasıl işlediğini bilmek için, optimize edicinin SQL sorgusunu yürütmesini simüle etmek için EXPLAIN anahtar sözcüğünü kullanın. Bu, sorgunuzun veya tablo yapınızın performans darboğazını analiz etmenize yardımcı olabilir. Açıklama komutu aracılığıyla şunları elde edebilirsiniz:

  • Tablo okuma sırası
  • Veri okuma işleminin işlem türü
  • Hangi dizinler kullanılabilir
  • Gerçekte hangi dizinler kullanılıyor
  • Tablolar arasındaki referanslar
  • Optimize edici tarafından her tablodaki kaç satır sorgulanır
  • Öncelikle EXPLAIN girdisini kullanmanın sonucuna bir göz atalım.

    Sonuç, bir grup alanın ve karşılık gelen değerlerin çıktı olduğunu gösteriyor, ancak bu alanlar ne anlama geliyor? Karşılık gelen değer nedir? Bu alanlar SQL performansını analiz etmek ve optimizasyonlar yapmak için nasıl kullanılır? Merak etmeyin, onları tek tek analiz edelim.

    EXPLANIN alan analizi kimliği: SELECT tanımlayıcısı. Bu, SELECT'in sorgu sıra numarasıdır select_type: SELECT türü, aşağıdakilerden herhangi biri olabilir BASİT: Basit SEÇİM (UNION veya alt sorgular kullanmayın) BİRİNCİL: en dıştaki SEÇİM · UNION: UNION'daki ikinci veya sonraki SELECT ifadesi BAĞIMLI BİRLİK: UNION'daki ikinci veya sonraki SELECT deyimi, dışarıdaki sorguya bağlıdır · BİRLİK SONUCU: BİRLİK'in sonucu SUBQUERY: alt sorgudaki ilk SELECT BAĞIMLI ALT Sorgu: Alt sorgudaki ilk SEÇİM, dış sorguya bağlıdır TÜREV: Türetilmiş tablonun SEÇİMİ (FROM yan tümcesinin alt sorguları) tablo: bu satırdaki verilerin hangi tabloyla ilgili olduğunu gösterir tür: Bu, en önemli alanlardan biridir ve ne tür bir sorgu kullanıldığını gösterir. En iyiden en kötüye bağlantı türleri system, const, eq_reg, ref, range, index ve ALL'dir. En iyi türden en kötü türe doğru sıralanmış çeşitli türler aşağıda verilmiştir: · System, const: Sorgu değişkenini sabite dönüştürebilirsiniz.Örneğin, id = 1; id birincil anahtar veya benzersiz anahtardır. · Eq_ref: erişim dizini, tek bir veri satırı döndür. (Genellikle bağlantıda görünür, sorgu tarafından kullanılan dizin birincil anahtar veya tek anahtardır) Ref: erişim indeksi, belirli bir değere ait verileri döndürür. (Birden çok satır döndürebilir) genellikle = kullanılırken oluşur · Aralık: Bu bağlantı türü, kullanım gibi bir aralıktaki satırları döndürmek için bir dizin kullanır > veya < Bir şey ararken ve alanda bir dizin olduğunda ne olur (Not: dizinden daha iyi olması gerekmez) Dizin: Dizin sırasına göre tam bir tablo taraması gerçekleştirin Avantajı, sıralamaya gerek olmaması, ancak dezavantajı tüm tablonun taranmasıdır. · TÜMÜ: Tam tablo taramasından kaçınılmalıdır olası anahtarlar: Bu tabloya uygulanabilecek dizinleri gösterin. Boşsa, olası bir dizin yoktur. İlgili alan adı için WHERE cümlesinden uygun bir cümle seçebilirsiniz. anahtar: Gerçekte kullanılan dizin. NULL ise, dizin kullanılmaz. MYSQL, az optimize edilmiş bir dizini nadiren seçer. Şu anda, bir dizini zorlamak için SELECT deyiminde INDEX (dizin) KULLANIN veya bir dizinin yok sayılmasına zorlamak için INDEX'i (dizin) YOKTUR key_len: Kullanılan dizinin uzunluğu. Doğruluk kaybı olmadan uzunluk ne kadar kısa olursa o kadar iyidir ref: mümkünse dizinin hangi sütununun kullanıldığını gösterir, sabittir satırlar: İstenen verileri döndürmek için MySQL'in alınması gerektiğini düşündüğü satır sayısı filtrelenmiş: Koşula göre filtrelenen satır sayısının tahmini yüzdesini gösterir. Ekstra: MYSQL'in sorguları nasıl ayrıştırdığı hakkında ek bilgi, özellikle aşağıdaki gibi · Distinct: MySQL ilk eşleşen satırı bulduktan sonra, geçerli satır kombinasyonu için daha fazla satır aramayı durdurur. Her kayıt için aralık kontrol edildi (dizin eşlemesi: #): MySQL kullanılabilecek iyi bir dizin bulamadı, ancak önceki tablodaki sütun değeri biliniyorsa, bazı dizinlerin mevcut olabileceğini buldu. · İndeksi kullanma: Yalnızca indeksi kullanın, tabloya erişimden kaçınabilirsiniz. · Tmporary kullanma: geçici bir tablo kullanın · Nereyi kullanma: Verileri nereye filtreleyeceğinizi kullanın .. Tüm where cümlelerinin nerede kullanılarak görüntülenmesi gerekmez.Örneğin, dizine erişmek için = kullanın. Filesort kullanma: MySQL, sıralı sırayla satırların nasıl alınacağını bulmak için ek bir geçiş gerektirir. uygulamayı açıkla

    Bu kadar çok şey söyledikten sonra, gerçek bilgi ancak uygulamadan gelebilir. Aşağıda dayanılmaz SQL'lerimizden bazılarını optimize etmek için basit bir örnek kullanıyoruz.

    Her şeyden önce, biz hala bir veri sayfası örneğiyiz. Tablo yapısı aşağıdaki gibidir.

    Bu tipik bir emir tablosudur.Diğer alanları atlayabiliriz Sadece temelde emir tablosunda kullanılan bir alan olan para alanına bakabiliriz. Zaman kısıtlamaları nedeniyle, bu tablo için önceden bir dizi simülasyon verisi hazırladım.

    Yukarıdaki şekilden de görülebileceği gibi tabloda hali hazırda 10.000 adet veri bulunmaktadır.Para koşullarına göre siparişleri sorgulamak için bir SQL yazalım.

    Sadece yukarıdaki resmin sonucunun tatmin edici olmadığı söylenebilir. Tür alanının değerinin TÜMÜ olduğu açıklama alanının önceki analizine dönelim. Analize göre, bu tablo tam bir tablo araması kullanıyor ve bundan kaçınmaya çalışmalıyız! ! ! Satır alanına tekrar bakın, değer 16242, aman tanrım! ! Tüm kayıtlar istenir, yavaşlık sebebi vardır.

    Peki, yukarıdaki veri analizi aracılığıyla, para alanının sorgu hızını artırmak için dizine eklenip eklenemeyeceğini düşünebilir miyiz? Çünkü yukarıdaki sonuçlar işe yaramaz bir indeks gibi görünüyor. Söyleyecek çok şey yok, hadi para alanına bir endeks ekleyelim

    İndeksi ekledikten sonra şimdi EXPLAIN cümlesiyle çalıştıralım ve mucizeye tanık olma zamanı!

    İndeks eklendikten sonra aynı sql deyimi tamamen farklı sonuçlar üretir.Type alanı range olur.Ayrıca anahtarın parayı gösterdiğini ve bu da index değerinin kullanıldığını kanıtlar. Daha da önemlisi, satır alanı 785 oldu. Orijinalle karşılaştırıldığında ne kadar olduğunu bilmiyorum. Performansın ne kadar iyileştirildiğini tahmin edebilirsiniz!

    Yukarıdakiler basit bir açıklama uygulamasıdır.

    sonuç olarak

    Açıklayarak, orijinal SQL üzerinde farklı analizler yapabiliriz, indeksin kullanılıp kullanılmadığını analiz edebiliriz, bunun hızlı bir SQL mi yoksa yavaş bir SQL mi olduğunu bilebiliriz, EXPLAIN'in rolü performans darboğazlarını ve çeşitli SQL'i göstermemize yardımcı olmaktır. Olası sonuçlar, MSQL sorgusunu optimize etmemiz için büyük önem taşıyor EXPALIN alanı farklı sonuçlar döndürürse, orijinal yavaş SQL'i dönüştürebiliriz.

    Yeniden yazdırma adresi: https://blog.51cto.com/13475644/2352985

    Blogger eflypro Xiaopu'nun orijinal eserleri

    LPL transfer dönemi başladı ve değerli WE oyuncusu ayrıldığını duyurdu! Gönderinin içeriği üzücü
    önceki
    2018 Fox RS yurtdışında 1500 birimle sınırlı sınırlı sayıda piyasaya sürüldü
    Sonraki
    Vivo NEX poster pozlama: 22,5 W süper hızlı şarjlı üst
    Vücudu sık sık olan bu yerli Rapçi markası, 2017 sonbahar ve kış serilerini çıkaracak!
    Linux birincil işletim ve bakımı (3) -Linux kullanıcı izinleri ve yönetimi
    Yeni BMW X5 "iyi bir genç adam", ancak yine de otonom sürüşü zorlamaya cesaret edemiyor
    LCK transfer dönemindeki büyük oyuncular bir takım oluşturur, IG'de 30 dakika hayatta kalabilirler mi?
    2018 popüler CM7 resmi olarak piyasaya sürüldü ve 16.99-22.99 milyon satış
    Bir makale sizi bilgisayarla görmeyi anlamaya götürür
    Birçok beceriye sahip ve ezici olmayan yılın amiral gemisi: Xiaomi 8 canlı deneyimi
    "Adınız" ardından. "Xin Haicheng yeni bir çalışma daha yayınladıktan sonra, bu sefer havayı kontrol edebilen bir kız!
    BYD Tang yeni model şüpheli fiyat / yapılandırma maruziyetinin bir kısmı
    Bilekte yeni favori: Bilezik gibi olmayan pek çok fonksiyona sahip Mi Band 3
    IG S8 neden dünya şampiyonu? Ning Wang canlı yayında detayları açıkladı! Netizen: Şampiyon olmayı hak ediyorsun
    To Top