如何以频繁的插入率提高MySQL查询的性能?

时间:2009-05-28 08:17:34

标签: php mysql performance scalability

我有约。表tb_post中有200K行,每5分钟就有一行。 10个新插页。

我正在使用以下查询来获取行 -

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是Float type
  • tb_post.USER_ID
  • 上有索引

有人可以建议我如何优化此查询并提高其读取性能吗?

PS:我是数据库扩展问题的新手。因此,任何类型的建议都将特定于此查询。

3 个答案:

答案 0 :(得分: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";""

答案 1 :(得分:3)

您可以尝试索引tb_post.RATING:MySQL有时可以使用索引来优化ORDER BY子句:http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

如果您尝试聚合来自不同表格的数据,您还可以检查所需的联接类型(http://en.wikipedia.org/wiki/Join_(SQL))。有些人比其他人好,这取决于你想要什么。

答案 2 :(得分:1)

如果您关闭ORDER BY,会对性能产生影响吗?如果这有很大的影响,那么可以考虑索引tb_post.RATING。

卡尔