LIMIT 0,5, Sorgulamayı 350 kez ÇIÇEKLE yapıyor

Aşağıdaki MySQL sorgusu 0,02 saniye altında tamamlandı:

 SELECT
    *
 FROM
    `Table1`
 WHERE
    `col1`     = '43532' AND
    `col2`     = 'N'
 ORDER BY col3 DESC 

Ancak, LİMİT 0, 5 'i eklediğimde 7 saniyeden fazla :

 SELECT
    *
 FROM
    `Table1`
 WHERE
    `col1`     = '43532' AND
    `col2`     = 'N'
 ORDER BY col3 DESC 
 LIMIT 0, 5

Bu, sorgu boş bir sonuç kümesi döndürdüğünde bile oluyor.

Neden bu basit sorgunun 350 kat daha yavaş olmasına neden olan LIMIT 0, 5 ekleniyor? Sonuçları sayfalandırma nedenleriyle sınırlayabilmem gerekiyor, bu yüzden bunu nasıl düzeltebilirim?

EDIT:

LİMİT OLMADAN, EXPLAIN diyor ki:

id  select_type table   type    possible_keys   key     key_len   ref     rows  Extra
1   SIMPLE      Table1  ref     col1,col2       col1    5         const   2441  Using where; Using filesort

LİMİTLE, EXPLAIN diyor ki:

id  select_type table   type    possible_keys   key   key_len   ref   rows  Extra
1   SIMPLE      Table1  index   col1,col2       col3  5         NULL  1050  Using where
0
@ckruse: Lütfen yukarıdaki düzenlememe bakın.
katma yazar ProgrammerGirl, kaynak
@GolezTrol: Her bir sorgu için aldığım 2 farklı EXPLAIN kullanıcısı için yukarıdaki yeni EDIT'e bakın (LIMIT 0,5 ile birlikte/olmadan).
katma yazar ProgrammerGirl, kaynak
@Adrian Cornish: SQL_NO_CACHE fark yaratmadı. Tablo 1'DEN DİZİNİ GÖSTER, sorguda (T1, col2 ve col3) bulunan TÜM sütunlar dahil, tek tek, birden çok dizinlenmiş sütun listelenmiştir.
katma yazar ProgrammerGirl, kaynak
Doğru zamanlama sonuçları aldığınızdan emin olmak için "SQL_NO_CACHE seç" i ekleyebilir ve "GÖSTERDEN DİZİNİ GÖSTER" sekmesinden de emin olabilirsiniz. Ayrıca iki soruyu da açıklayabilir misiniz?
katma yazar Adrian Cornish, kaynak
Her iki sorgunun açıklanması bu mu? Belki LIMIT bir başka anahtar kullanarak MySQL'i zorlar.
katma yazar GolezTrol, kaynak
Bu, sorguların nasıl optimize edileceği konusunda yardımcı olabilir: databasejournal.com/features/mysql/article.php/1382791/…
katma yazar Brad Christie, kaynak
EXPLAIN yazan nedir?
katma yazar ckruse, kaynak

2 cevap

Limit start, marj, DB motorunun hesaplanmasına bağlıdır. Sayfalama için her 5 satır için DB'ye basmayın, en iyi ihtimalle 500 kayıt getirin. ön uç, ve sonra JavaScript ile hitap, sonraki her 500 kayıt için kabul edilebilir DB vurmak için ..

0
katma
Ama neden boş bir sonuç setinde bile Sorguyu 350 kat daha yavaş yapsın? Başka bir şey oluyor gibi görünüyor ...
katma yazar ProgrammerGirl, kaynak
İlk önce kayıtları alır ve sonra gerekli satırları çıkarır, temp_table içine ekler ve daha sonra istenilen satırları temp_table ...
katma yazar Sashi Kant, kaynak

Sorun, limitin MySQL'in sorgusu ilk önce sipariş etmesini, tüm kümeyi sipariş etmesini zorlamasını ve ardından dizini kullanmamasını filtrelemesine neden olmasıdır.

MySQL'in hangi dizinin kullanılacağını belirten yönergeler vardır, ancak col1, col2 ve col3'te birleşik bir dizin oluşturmak daha iyi olabilir. MySQL, bu dizini filtrelemek ve sıralamak için kullanmalıdır. Sorgunun daha hızlı olup olmadığını görmek için denemelisiniz, eğer col3 bu dizinin ilk veya son sütunuysa.

0
katma