2011-06-18 75 views
1

我有一個非常簡單的查詢,即時通訊嘗試優化,它需要2〜5秒執行。使用臨時;使用filesort ..慢查詢

這是我的CREATE TABLE

CREATE TABLE `artist` (
    `id` INTEGER NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(100) character set utf8 NOT NULL, 
    `bio` MEDIUMTEXT character set utf8 DEFAULT NULL, 
    `hits` INTEGER NOT NULL, 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE `album` (
    `id` INTEGER NOT NULL AUTO_INCREMENT, 
    `artist_id` INTEGER NOT NULL, 
    `title` VARCHAR(100) character set utf8 NOT NULL, 
    `year` INTEGER, 
    `hits` INTEGER NOT NULL, 
    PRIMARY KEY (`id`), 
KEY (`artist_id`) 
); 

CREATE TABLE `track` (
    `id` INTEGER NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(100) character set utf8 NOT NULL, 
    `lyric` MEDIUMTEXT character set utf8, 
    `album_id` INTEGER NOT NULL, 
    `hits` INTEGER NOT NULL, 
    `date` datetime NOT NULL, 
    PRIMARY KEY (`id`), 
KEY (`album_id`) 
); 

ALTER TABLE `album` ADD FOREIGN KEY (artist_id) REFERENCES `artist` (`id`); 
ALTER TABLE `track` ADD FOREIGN KEY (album_id) REFERENCES `album` (`id`); 

,這是運行

SELECT DISTINCT artist.name, track.name 
FROM track 
LEFT JOIN album ON track.album_id = album.id 
LEFT JOIN artist ON album.artist_id = artist.id 
ORDER BY track.hits DESC 
LIMIT 5 

解釋選擇顯示此查詢即時通訊:

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE track ALL  NULL NULL NULL NULL 103796 Using temporary; Using filesort 
1 SIMPLE album eq_ref PRIMARY  PRIMARY  4 lyrics.track.album_id 1  
1 SIMPLE artist eq_ref PRIMARY  PRIMARY  4 lyrics.album.artist_id 1  

我是新來的MySQL,但我猜測使用使用臨時;使用filesort是不好的,這就是爲什麼查詢非常緩慢,你們可以在這裏暗示我嗎?謝謝!

更新:這裏的主要問題是,同一首歌可以在不同ID的數據庫中5次,因爲同一首歌可以在不同的相冊中。如果我不使用截然不同,這沒有發生,胸圍我必須出於這個原因

+0

爲什麼你在主鍵上有DEFAULT NULL? –

+0

錯誤,修復它。 – Peibol

回答

1

你可以得到它通過增加

create index idx_tracks_on_album_id_name_hits on track(album_id, name, hits); 

使用的指標,因爲你在做跨兩個表DISTINCT,就不會有指數可能找到唯一行,因此將其放入一個臨時表擺脫重複。

0

我認爲如果您創建track索引。 hits,你可能會擺脫「臨時使用;使用filesort」,其原因可能是因爲MySQL無法找到索引來進行排序。

ALTER TABLE `track` 
ADD KEY `idx_hits` (`hits`); 

讓我知道它是否工作。

+0

nope,它仍然是一樣的:/ – Peibol

+0

你是說在track.hits中添加索引並沒有提高性能嗎?或者你是說說EXPLAIN仍然說同樣的事情? –

+0

抱歉不具體。性能還是一樣的,EXPLAIN顯示的是同樣的東西,所以 – Peibol

0

你爲什麼使用DISTINCT?爲什麼使用LEFT JOIN(加入JOIN)?

+0

我使用DISTINCT,因爲一首歌可以在很多專輯中,如果我不這樣做,結果可能是同一首歌的5倍。關於LEFT JOIN,說實話我不能給你一個答案,它只是工作,我用它。只使用JOIN使我具有相同的性能。 – Peibol

相關問題