千万级表和小表的JOIN + ORDER BY 如何优化?

来源:7-7 特定SQL的查询优化

慕慕7652243

2018-07-06

SELECT

`v_yy_yb021_ext`.typeid,

`v_yy_yb021_ext`.title,

`v_yy_yb021_ext`.orgid AS jgid,

`v_yy_yb021_ext`.orgname AS jgmc,

`v_yy_yb021_ext`.humanname AS author,

`v_yy_yb021_ext`.ctime AS time,

`v_yy_yb021_ext`.seq AS id,

`v_yy_yb021_ext`.typename AS type

FROM `human_famous`

LEFT JOIN `v_yy_yb021_ext`

ON `human_famous`.`hycode` = `v_yy_yb021_ext`.`hycode`

AND `human_famous`.`humanid` = `v_yy_yb021_ext`.`humanid`


WHERE `v_yy_yb021_ext`.`isvalid` = 1

AND `v_yy_yb021_ext`.`declaredate` >= '2016-10-06'

ORDER BY `ctime` DESC

LIMIT 0,10;

去掉排序,需要执行5s,排序的话需要60s。

EXPLAIN输出如下:

1	SIMPLE	human_famous		index	PRIMARY	PRIMARY	                                               132		                        2701	100	Using index; Using temporary; Using filesort
1	SIMPLE	v_yy_yb021_ext		ref	hycode,declaredate,humanid,hycode_humanid,humanid_ctime	hycode	67	vis_db.human_famous.hycode	2	2.5	Using where


写回答

1回答

sqlercn

2018-07-06

可以试试先在子查询中把需要的大表数据过滤出来,然后再和小表关联的方式。
1
4
慕慕7652243
回复
sqlercn
子查询加上limit ,结果就对不上了的。
2018-07-06
共4条回复

MySQL提升课程 全面讲解MySQL架构设计

面面俱到讲解影响MySQL性能的各个因素,让MySQL架构了然于胸。

4419 学习 · 547 问题

查看课程