我有约.表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类型
> tb_post.USER_ID上有索引
任何人都可以建议我如何优化此查询并提高其读取性能?
PS:我是数据库扩展问题的新手.因此,任何类型的建议都将特定于此查询.
解决方法:
您需要一个覆盖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";""
标签:php,mysql,scalability,performance
来源: https://codeday.me/bug/20190610/1214847.html