2010-10-26 43 views
1

我有被記錄爲慢速查詢以下查詢:低速選擇查詢與左連接爲null,並且限制導致

EXPLAIN EXTENDED SELECT * 
FROM (
`photo_data` 
) 
LEFT JOIN `deleted_photos` ON `deleted_photos`.`photo_id` = `photo_data`.`photo_id` 
WHERE `deleted_photos`.`photo_id` IS NULL 
ORDER BY `upload_date` DESC 
LIMIT 50 

這裏的輸出解釋:

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE photo_data index NULL upload_date 8 NULL 142523 
1 SIMPLE deleted_photos eq_ref photo_id photo_id 767 tbc.photo_data.photo_id 1 Using where; Not exists 

我可以看到它必須通過所有142K記錄才能從數據庫中提取最新的50個記錄。

我有兩個指標:

UNIQUE KEY `photo_id` (`photo_id`), 
KEY `upload_date` (`upload_date`) 

我希望帽子UPLOAD_DATE索引鍵,將有助於限制的行數。關於我能做些什麼來加速這件事的任何想法?

回答

2

您可以在您的photo_data表中添加一個字段,以顯示它是否被刪除,而不必通過連接到另一個表來找出這個事實。然後,如果您在(deleted, upload_date)上添加索引,則您的查詢應該非常快。

+0

好,我會給一個去感謝 – 2010-10-26 22:15:45

+0

所以我異型查詢新的一個: 選擇'photo_data'.'photo_id','photo_data'.'image_fullsize','image_thumbnail','photo_description' FROM( 'photo_data') 其中'deleted' = '0' ORDER BY'upload_date'遞減 LIMIT 50 這種新花1.2秒排序....我添加了一個新的索引上刪除... – 2010-10-27 00:02:38

+0

Steudel:你有沒有試着在我的文章中建議在'(deleted,upload_date)'上添加一個組合索引?我不記得創建索引的確切語法,但沿着這些方向:'ALTER TABLE photo_data ADD INDEX deleted_upload_date(deleted,upload_date)'。我認爲這會對查詢的速度產生巨大的影響,因爲它應該從O(n log n)到幾乎O(1)。 – 2010-10-27 09:37:21