2010-11-18 18 views
0

Ben sorgularda Gereksiz gecikmeleri kesmeye bir web uygulaması profilleme ediyorum EXPLAIN kullanarak, geçici kullanarak almak MySql üzerinde optimizasyonu ile sıkışmış ve ben basit gibi görünüyor tane buldum ama almak yürütmek için çok zaman.dosya sıralama ... mesajlar

SELECT `bt`.`id_brand` 
FROM `brands_translation` AS `bt` 
WHERE bt.code_language = 'es' 
GROUP BY `bt`.`id_brand` 
ORDER BY `bt`.`name` ASC 

Ve tablo tanımı:

CREATE TABLE IF NOT EXISTS `brands_translation` (
    `id_brand` int(64) unsigned NOT NULL, 
    `code_language` varchar(3) NOT NULL, 
    `name` varchar(128) NOT NULL, 
    `link` varchar(255) default NULL, 
    `logo` varchar(255) default NULL, 
    `description` text NOT NULL, 
    KEY `id_brand` (`id_brand`), 
    KEY `code_language` (`code_language`), 
    KEY `name` (`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Ben dizinleri oluşturarak bunu çözmeye Bu sorgu ise

Using where; Using temporary; Using filesort 

:

Kullanılması Ben şu mesajları almak AÇIKLAYINIZ Sonuçta olmayan her alan için.

Bununla ilgili bir fikrin var mı? Uygun bir INDEX ile peşin

cevap

0

yılında

sayesinde MySQL çok iyi ORDER BY deyimi olmadan düzgün sonuçlarınızı sıralayabilirsiniz. ORDER BY Optimization ve LIMIT Optimization'a bakmak isteyeceksiniz.

Aksi takdirde, geçici ve filesort kullanımı, farklı GROUP BY ve ORDER BY geliyor. Bu özel sorgu için yerinde var indeksleri kaldırmak ve bu bir eklersiniz: Elbette

ALTER TABLE `brands_translation` ADD INDEX (`code_language` , `id_brand` , `name`); 

, bu proje boyunca diğer sorguları etkileyebilir. Bu işlem tamamlandıktan sonra, sorgunuzu değiştirin:

SELECT `bt`.`id_brand` 
FROM `brands_translation` AS `bt` 
WHERE bt.code_language = 'es' 
GROUP BY `bt`.`id_brand`, `bt`.`name` 
ORDER BY `bt`.`id_brand`, `bt`.`name` 

adıyla gruba istemeyebilirsiniz fark eden sen BY ifadesi GROUP adını kaldırabilir, ama bu GRUBU ve SİPARİŞ beri (size using temporary tekrar verecek farklıdır).

+0

Cevabınız için teşekkürler! Çözüm için yeni yollar açar. Mesele şu ki, isme göre sıralamaya çalışıyorum ve bu örnekte, sipariş önce id_brand tarafından yapılmıştır. –

0

aşağıdaki bakalım ... Lütfen

drop table if exists brands_translation; 
create table brands_translation 
(
code_language varchar(3) not null, 
id_brand int unsigned not null, 
-- other fields here... 
primary key(code_language, id_brand) -- clustered composite primary key (please !!) 
) 
engine=innodb; 

neden alıntı `yapmanız gerekenler ve veri türleri pls sıralamak yok zaman.