2009-05-28 33 views
4

我約有。在表格tb_post中的200K行,並且每5分鐘它具有約。 10個新插入。如何提高頻繁插入頻率下MySQL查詢的性能?

我使用下面的查詢,以獲取行 -

SELECT tb_post.ID, tb_post.USER_ID, tb_post.TEXT, tb_post.RATING, tb_post.CREATED_AT, 
     tb_user.ID, tb_user.NAME 
FROM tb_post, tb_user 
WHERE tb_post.USER_ID=tb_user.ID 
ORDER BY tb_post.RATING DESC 
LIMIT 30 

它時超過10秒獲取的排序方式中的所有行。

以下是EXPLAIN查詢的報告:

id select_type  table  type possible_keys key    key_len  ref   rows  Extra 
1 SIMPLE   tb_user  ALL  PRIMARY   NULL   NULL  NULL  20950  Using temporary; Using filesort 
1 SIMPLE   tb_post  ref  tb_post_FI_1 tb_post_FI_1 4   tb_user.id 4

投入少:

  • tb_post.RATING是浮子式
  • 上有tb_post.USER_ID

任何人都可以給我建議指數我應該如何優化這一點的幾點提示查詢並提高其讀取性能?

PS:我是數據庫擴展問題的新手。因此,任何類型的建議都將對這個查詢特別有用。

+1

爲什麼你不想要索引? – 2009-05-28 08:24:09

+0

對不起,我感到困惑。我糾正了我的問題。我確實想索引,並且USER_ID已經被編入索引,但它仍然沒有幫助。問題是 - 我是否也需要索引其他欄目,如果是,哪些欄目? – Aditya 2009-05-28 08:30:15

+0

也許你應該考慮使用JOIN操作,並小心你加入你的表的順序 - 首先變小。但它取決於你使用的數據庫..更多信息http://stackoverflow.com/questions/173726/when-and-why-are-database-joins-expensive/173744#173744 – 2009-05-28 08:37:57

回答

1

如果關閉ORDER BY,會發生什麼情況,是否會對性能產生影響?如果這有很大的影響,那麼可以考慮索引tb_post.RATING。

卡爾

4

您需要一個包含ORDER BY和WHERE子句的tb_post索引。的

CREATE INDEX idx2 on tb_post (rating,user_id)

= >輸出EXPLAIN SELECT ... ORDER BY tb_post.RATING DESC LIMIT 30

"id";"select_type";"table";"type";"possible_keys";"key";"key_len";"ref";"rows";"Extra" 
"1";"SIMPLE";"tb_post";"index";NULL;"idx2";"10";NULL;"352";"" 
"1";"SIMPLE";"tb_user";"eq_ref";"PRIMARY";"PRIMARY";"4";"test.tb_post.USER_ID";"1";""