我有约。表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:我是数据库扩展问题的新手。因此,任何类型的建议都将特定于此查询。
答案 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。
卡尔