Bir dizinin MySQL'de sıralamak için kullanılıp kullanılmadığını nasıl anlayabilirim?


10

WHERE yan tümcesinde, esas olarak form kullanılan bir dizin üzerinde son sütun olan bir sütun kullanan bir ORDER BY yan tümcesi ile bir sorgu var:

SELECT
  cols
FROM
  tables
WHERE
  col_1 = x
  AND col_2 = y
  AND col_3 = z
ORDER BY col_4

ve dizin bu sırayla sütunlarda (col_1, col_2, col_3, col_4) oluşturulur.

Ben zaman% 99'dan fazla sorgu profil "Sıralama sonucu" durumunda geçirilir. col_4, herhangi bir fark yaratıyorsa bir zaman damgası sütunudur. ORDER BY'ın bir dizini yalnızca belirli koşullar altında kullanabileceğini anlıyorum, ancak yine de tam olarak optimizasyoncunun ne zaman yapacağına dair biraz gizem duyuyorum.

Yanıtlar:


13

Sorgudan EXPLAIN EXTENDEDönce eklemeli ve sonucu kendiniz görmelisiniz.

İçin bir girişi olmalı

  • possible_keys

Bu sütun NULL ise, ilgili dizin yoktur. Bu durumda, WHERE yan tümcesini inceleyerek dizine ekleme için uygun olabilecek bazı sütun veya sütunlara karşılık gelip gelmediğini kontrol ederek sorgunuzun performansını artırabilirsiniz.

ve

  • Anahtarlar

Anahtar sütunu, MySQL'in gerçekten kullanmaya karar verdiği anahtarı (dizin) gösterir. MySQL, satırları aramak için olası_anahtarlar dizinlerinden birini kullanmaya karar verirse, bu dizin anahtar değeri olarak listelenir.

Daha fazla bilgi için bu Explain çıktısına ve Explain join_types'e başvurabilirsiniz.


Özellikle benim sorum ORDER BY deyimiyle ilgili olduğunu anlıyorum. Sorgum, döndürülen satırları kısıtlamak için belirtilen dizini kullanıyor, ancak ORDER BY deyimi için kullanmadığını tahmin ediyorum sıralama performansı göz önüne alındığında.
Chris Cooper

1
Bazı durumlarda, MySQL ORDER BY deyimini karşılamak için herhangi bir ek sıralama yapmadan bir dizin kullanabilir. Dizin ayrıca, ORDER BY dizini tam olarak eşleşmese bile, dizinin kullanılmayan tüm bölümleri ve tüm fazladan ORDER BY sütunları WHERE yan tümcesinde sabitler olduğu sürece kullanılabilir. Aşağıdaki sorgular ORDER BY bölümünü çözmek için dizini kullanır ve bu dev.mysql.com/doc/refman/5.0/tr/order-by-optimization.html adresini ziyaret edin
Mahesh Patil

1

Sen kullanmak EXPLAINiçin sorguyu ( explain select-or-whatever-your-query-is).

possible_keyskullanılabilir olanları, keygerçekten kullanılanları gösterir.


1
Buna eklemek için: explain format=json select ...daha da güçlü. Bu içerir used_key_partsbir bileşik anahtar kısmen veya tamamen kullanılmış ve olmadığını söyler, index_conditionhangi indeks sorumlu olduğu sorgunun parçası söyleyecektir.
okdewit
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.