2009-11-23 62 views
0

我有一個查詢從〜10,000的表中提取5條記錄。 order子句不包含在索引中,但where子句是。如何減少由MySQL掃描的行數

該查詢掃描大約7,700行來獲取這5個結果,這似乎有點多。不過,我明白,排序標準的複雜性使事情變得複雜。如果有的話,我可以減少掃描的行數嗎?

查詢看起來是這樣的:

SELECT * 
FROM `mediatypes_article` 
WHERE `mediatypes_article`.`is_published` = 1 
ORDER BY `mediatypes_article`.`published_date` DESC, `mediatypes_article`.`ordering` ASC, `mediatypes_article`.`id` DESC LIMIT 5; 

medaitypes_article.is_published索引。

+0

你可以發佈表聲明的相關位? – shylent 2009-11-23 06:55:09

+2

在發佈的查詢前面放置'EXPLAIN',運行它併發布輸出。 – Asaph 2009-11-23 06:55:18

+0

文章 http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html – 2009-11-23 06:56:36

回答

3

「is_published = 1」適用於多少行? 我假設這是... 7.700行?

無論採取哪種方式,完整結果將匹配的WHERE子句必須提取和完全排序的所有排序標準。然後,所有已排序的已發佈文章的完整列表將在前5個結果後截斷。

也許它可以幫助您查看有關ORDER BY優化的MySQL documentation article,但首先您應該嘗試將索引應用於ORDER BY語句中指定的列。這很可能會大大加速事情。

0

當您訂購時,您必須遍歷所有btree以找出正確的順序。

10,000條訂單記錄並不是那麼大的擔心。請記住,通過適當的索引,RDBMS不會獲取整個記錄來找出訂單。它在保存在磁盤上的btree頁面中有索引列,並且頁面讀取很少,整個btree被加載到內存中並且可以遍歷。

0

在MySQL中,您可以創建一個包含多列的索引。我認爲你可能需要做的是製作一個包含is_published和published_date的索引。您應該查看EXPLAIN語句的輸出,以確保它以智能的方式執行操作,如果不是,則添加索引。