回答

收藏

优化MySQL查询避免在哪里?临时使用;使用文件排序。

技术问答 技术问答 253 人阅读 | 0 人回复 | 2023-09-14

我使用MySQL为自己的网站建立了一个自定义论坛。列表页面本质上是一个包含以下各列的表: 主题    ,最近更新    和 #回复    。
' r0 Q; N  z2 \9 G) l4 RDB以下表:
0 b' M1 v! G% b2 h* a+ f3 kidnamebodydatetopic_idemail一个 主题    为“0”的topic_id,并 回复    有自己的母亲话题topic_id。
% S) Z' h3 d. k2 V7 JSELECT SQL_CALC_FOUND_ROWS    t.id,t.name,MAX(COALESCE(r.date,t.date)) AS date,COUNT(r.id) AS repliesFROM    wp_pod_tbl_forum tLEFT OUTER JOIN    wp_pod_tbl_forum r ON (r.topic_id = t.id)WHERE    t.topic_id = 0GROUP BY    t.idORDER BY    date DESC LIMIT 0,20;该表共有约2100个项目,查询通常需要6秒钟。
7 K# g3 z7 a) N: C3 X  \topic_id添加列中INDEX,但这并没有多大帮助。在没有重大重组的情况下,有没有办法加快查询速度?8 ]; ?8 c0 G- u) ^  P, n
编辑    :工作不太好。我似乎无法使下面的例子正常工作。- p) X3 h2 y% c" b6 ~! H: t1 q
                                                                8 U- V' v% Y3 Y. h
    解决方案:                                                               
3 Z6 u2 A( ^' l( j2 p: t    2020假如你的手表是MyISAM或id不是PRIMARY KEY,你需要创建一个复合材料ondex (topic_id,id)。9 Y! h) y; G: q( E: T
假如你的手表是,InnoDB并且id是PRIMARY KEY,只创建索引(topic_id)可以了(id将隐式添加到索引中)。8 Z6 V3 s& l0 x; I4 O$ A2 s! Y; g
更新
5 e# O3 r; M' h+ T2 r如果你必须对索引进行索引,这个查询可能会更有效(topic_id,id)和(date,id):
* |" X/ M9 C7 I2 R& z详情请参阅我的博客:
; k5 V+ Z* a8 T' E5 E) x' m; z选择最后的论坛帖子30 已完成查询ms样本数据为10000行:, j$ W0 z( _8 i) D3 g1 L6 C
SELECT  id,name,last_reply,   SELECT  COUNT(*)        FROM    wp_pod_tbl_forum fc        WHERE   fc.topic_id = fl.topic_id       AS repliesFROM    (            SELECT  topic_id,date AS last_reply        FROM    wp_pod_tbl_forum fo        WHERE   id =               SELECT  id                FROM    wp_pod_tbl_forum fp                WHERE   fp.topic_id = fo.topic_id                ORDER BY                        fp.date DESC,id DESCLIMIT  20id DESCLIMIT  20有效查询这两个索引是必要的。
0 Z8 ]$ f2 K# M$ j1 A+ b$ |) y: f如果您的表是,InnoDB 并且    id是PRIMARY KEY,则您可以从indexes上面省略id 。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则