优化MySQL查询避免在哪里?临时使用;使用文件排序。
技术问答
415 人阅读
|
0 人回复
|
2023-09-14
|
我使用MySQL为自己的网站建立了一个自定义论坛。列表页面本质上是一个包含以下各列的表: 主题 ,最近更新 和 #回复 。
9 q1 n: ~; w. cDB以下表:7 q- W- u3 H$ m& C! `8 t" A9 O
idnamebodydatetopic_idemail一个 主题 为“0”的topic_id,并 回复 有自己的母亲话题topic_id。
' ?' b% H5 c$ V# p" `SELECT 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秒钟。+ F' ]. M9 W9 d1 C
topic_id添加列中INDEX,但这并没有多大帮助。在没有重大重组的情况下,有没有办法加快查询速度? c; g2 Z: m2 s! @! Z# N) T
编辑 :工作不太好。我似乎无法使下面的例子正常工作。
' M) Y# J1 u( G( J7 ?! I
2 k- A5 Y1 @9 J$ A( N 解决方案: 0 N v8 S- T# I9 E8 k
2020假如你的手表是MyISAM或id不是PRIMARY KEY,你需要创建一个复合材料ondex (topic_id,id)。( }; x+ [% ^! i n* G4 [" J# z% C
假如你的手表是,InnoDB并且id是PRIMARY KEY,只创建索引(topic_id)可以了(id将隐式添加到索引中)。
2 Q3 B1 h) I+ J/ _* U更新
' F. S7 T- H; O, i+ e如果你必须对索引进行索引,这个查询可能会更有效(topic_id,id)和(date,id):- \' U% n. {$ P6 A$ r
详情请参阅我的博客:
; u) V- E7 T& S! W! L2 d选择最后的论坛帖子30 已完成查询ms样本数据为10000行:
* M0 d! U! \; ~0 w# M, T, jSELECT 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有效查询这两个索引是必要的。
) r* A, T( l- A. [# I3 Q l h- \6 @如果您的表是,InnoDB 并且 id是PRIMARY KEY,则您可以从indexes上面省略id 。 |
|
|
|
|
|