2011-05-24 12 views
6

Muhtemelen aptalca bir şey eksik ... Görünüşe göre MySQL 5.1, ORDER BY yan tümcesinde tam olarak eşleşen bir dizin olduğunda bile bir Filesort yapmaya devam ediyor. Burada Yayınlamak için ben veri modelini basitleştirilmiş ettik ama sorun hala oluyor:MySQL 5.1 bir dizin mevcut olduğunda filesort olayı kullanarak

Tablo tanım:

CREATE TABLE `event` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) DEFAULT NULL, 
    `owner_id` int(11) DEFAULT NULL, 
    `date_created` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `owner_id` (`owner_id`), 
    KEY `date_created` (`date_created`), 
    CONSTRAINT `event_ibfk_1` FOREIGN KEY (`owner_id`) REFERENCES `user_profile` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; 

Sorunum basit SEÇ "filesort kullanma" gösterildiğinden emin olaydır :

explain select * from event order by date_created desc; 

Ve sorgu için sonuç açıklamak:

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  event ALL NULL  NULL NULL NULL 6  Using filesort 

Bu tür sorgularda, dizin dosyalarının dizin oluşturulmasını kullanmanın bir yolu var mı?

Herkese şimdiden teşekkürler.

cevap

3

MySQL endeksi kullanmak yapacak 10'dan az satır (AUTO_INCREMENT=7) ve benim yüklemesinde FORCE INDEX kullanarak sahip olduğunu gösterir, ben optimize edici tahmin ediyorum bir tablo taraması daha hızlı (daha az rastgele I sanıyor/Ç) bir indeks taramasından (sadece date_created değil, tüm sütunları seçtiğinizden). Bu aşağıdaki ile teyit edilir: Sadece endeksli sütunu iade edilmesi gerektiğinden Yukarıdaki durumda

mysql> explain select date_created from event order by date_created; 
+----+-------------+-------+-------+---------------+--------------+---------+------+------+-------------+ 
| id | select_type | table | type | possible_keys | key   | key_len | ref | rows | Extra  | 
+----+-------------+-------+-------+---------------+--------------+---------+------+------+-------------+ 
| 1 | SIMPLE  | event | index | NULL   | date_created | 9  | NULL | 1 | Using index | 
+----+-------------+-------+-------+---------------+--------------+---------+------+------+-------------+ 
1 row in set (0.00 sec) 

, endeks tarama hızlıdır.

MySQL dokümantasyon bir dizin kullanılarak sayılır bazı durumlarda vardır yavaş: aslında küçük tablolar için performans (azalacak, bu durumda bir dizin zorlama http://dev.mysql.com/doc/refman/5.1/en/how-to-avoid-table-scan.html

0

S: Bu tür sorgularda dizin oluşturmak yerine dizini kullanmanın bir yolu var mı?

A: deneyin mümkünse MySQL endeksi kullanmak zorunda için: FORCE INDEX (index_name) kullanarak

EXPLAIN SELECT * FROM event FORCE INDEX (date_created) ORDER BY date_created DESC; 

, bu hiç de mümkünse indeksi faydalanmak için MySQL söyler. Bu direktifin olmaması durumunda, MySQL sonuç kümesini döndürmek için en etkili yolu seçecektir. Bir dosya yöneticisi, dizini kullanmaktan daha verimli olabilir. senin CREATE TABLE açıklamada yana

+0

bütün satır mevcut değildir çünkü rastgele G/Ç istiyor dizin ağacı). Tablo büyürse, optimize edici endeksi kullanacaktır. –

İlgili konular