2013-03-05 62 views
0

MySQL查詢優化我需要一些建議。更一般我在下面的例子說明: 我有MySQL的InnoDB表「崗位」與字段:與LIMIT,ORDER BY子句布爾和IN子句

`id` - INT UNSIGNED AUTOINCREMENT 
`title` - VARCHAR(100) 
`abstract` - TEXT #can be converted to VARCHAR(2048) 
`content` - TEXT #text + thml tags 
`category` - SMALLINT 
`created_on` - DATETIME 
`modified_on` - DATETIME 
`enabled` - TINYINT(1) 
`deleted` - TINYINT(1) 

隨着inexes上

`id` - PRIMARY 
`category` - INDEX 
`modified_on` - INDEX 
(`enabled`,`deleted`) - INDEX 

表包含10-15萬元的紀錄。我正在查詢

SELECT id, title, abstract FROM posts 
WHERE enabled = 1 AND deleted = 0 
    AND category IN ({id's}) 
ORDER BY modified_on DESC 
LIMIT {offset}, {limit} 

隨着50-100個併發請求到MySQL服務器它下降。 每個查詢在0.1-0.5s內執行,取決於限制條款。

我是否需要單獨的索引作爲'category',因爲有時我會瀏覽所有類別的所有帖子,或者我可以將'category'添加到(enabled,deleted)索引並每次傳遞所有類別的id(~200)我需要來自所有人的帖子嗎?

有什麼解決辦法可能會導致改善此類查詢的速度?

在此先感謝。

+0

看看EXPLAIN語句,它應該幫助你獲得更多的信息,http://dev.mysql.com/doc/refman/5.5/en/using- explain.html。 – pedromarce 2013-03-05 12:55:34

+0

你的'抵消'和'極限'有多大? – Quassnoi 2013-03-05 13:03:23

+0

限制通常是10-100,並且偏移量可以是從0到10-15百萬的任何值。這是分頁,它被緩存了,但是每次修改後,'modified_on'都會改變。實際上'modified_on'最好調用'last_open_on'。因此,每當有人查看任何文章時,緩存就會失效 - 此後應該先分頁分頁。 – 2013-03-05 13:12:20

回答

1

我想你應該在包含'enabled'和'deleted'的索引中添加category。

希望它能減少你的查詢時間