2009-05-28 76 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";""