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

Php 如何利用频繁插入率提高MySQL查询的性能?,php,mysql,performance,scalability,Php,Mysql,Performance,Scalability,我在一个表中有大约20万行tb\u post,每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

我在一个表中有大约20万行
tb\u post
,每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秒以上的时间

以下是解释查询的报告:

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 id选择\u类型表类型可能的\u键\u长度参考行额外 1个简单的tb_用户所有主NULL 20950使用临时;使用文件排序 1个简单tb_post ref tb_post_FIU 1 tb_post_FIU 1 4 tb_用户id 4 少量输入:

  • tb\u post.RATING
    为浮动类型
  • tb\u post.USER\u ID上有索引
有谁能给我一些建议,告诉我应该如何优化这个查询并提高它的读取性能


PS:我是数据库扩展问题的新手。因此,针对此查询,任何类型的建议都是有用的。

如果您取消订单,会发生什么情况,这会影响性能吗?如果这有很大的影响,那么可以考虑索引TBXPOST。
Karl

您可以尝试索引
tb\u post.RATING
:MySQL有时可以使用索引来优化
ORDER BY
子句:


如果试图聚合来自不同表的数据,还可以检查所需的联接()类型。根据您的需要,有些比其他更好。

您需要一个包含ORDER BY和WHERE子句的tb\U post索引

CREATE INDEX idx2 on tb_post (rating,user_id)
=>解释选择的输出…按tb_后评级描述限制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";“简单”;“结核杆菌员额”;“索引”;无效的“idx2”;"10";无效的"352";""
"1";“简单”;“tb_用户”;“eq_ref”;“初级”;“初级”;"4";“test.tb\u post.USER\u ID”;"1";“对不起,弄糊涂了。我纠正了我的问题。我确实想建立索引,而且用户ID已经建立了索引,但仍然没有帮助。问题是,我也要索引其他列,如果是,哪一个?MayBee你应该考虑使用连接操作并谨防你加入表格的顺序-较小的第一个。但这取决于你使用的数据库。。更多信息“对不起,对于URL,我不允许发布超链接…-这是‘可修复的’:-)tb_post.RATING是浮动类型。那么,索引在浮点型列上工作得好吗?此外,当有人投票给那个帖子时,收视率确实经常变化。因此,每当有人投票时,MySQL都需要再次构建索引。如果投票率相当频繁,那么每次构建索引都会很昂贵,对吗?我试着增加评级指数,现在第一次需要10秒以上,但下一次,如果没有新的投票,则需要1-2秒。但是,一旦有人投票,它再次需要大量的时间来获取相同的页面。所以,请给出建议。如何创建索引,更重要的是,如何更新评级?我刚刚检查了一个200k行测试表(id、rating、text、user_id):创建索引需要3秒钟,不管索引包含什么(特别是使用VolkerK的方法)。更新单行以更改额定值需要几毫秒,这是应该的。您不会每次更新时都创建索引:相反,您可以运行一个普通的更新查询,并让MySQL更新其索引。如果你确定你正确地进行了更新(更新,而不是创建索引),检查罪魁祸首是否确实是MySQL,而不是缓存系统或其他什么。我需要显示基于其流行评级的结果。@Aditya-您是否尝试添加tb_post.rating的索引?