Mysql语句优化有一点疑问~~

2012-10-25 12:56:48 +08:00
 kchum
语句如下
SELECT COUNT(DISTINCT `t`.`id`) FROM `vt_crm`.`customerusers` `t`
LEFT OUTER JOIN `vt_crm`.`customer` `sales`
ON (`t`.`customerid`=`sales`.`id`)
LEFT OUTER JOIN `vt_base`.`cate` `cate`
ON (sales.cateid = cate.id)
LEFT OUTER JOIN `vt_base`.`city` `city`
ON (city.id = sales.cityid)
WHERE ((gradeid='5') AND (sales.enable='1'))

count是查总数,做分页的(customerusers 表 230w数据,customer表50W数据,gradeid是6个值,enable是可用)~

查出来要2秒多。就算去掉后面的cate跟city也要将近2秒

查资料时也试过用SQL_CALC_FOUND_ROWS,FOUND_ROWS比用count还慢~

请问下大家该如何优化这条语句
或者有没有其他方案去查符合条件的总数~
3184 次点击
所在节点    MySQL
7 条回复
explon
2012-10-25 12:58:16 +08:00
你索引没做好吧
kchum
2012-10-25 13:01:51 +08:00
@explon 联合索引没做,gradeid就6个值。作用不大吧~
explon
2012-10-25 13:35:07 +08:00
@kchum 作用很大
kchum
2012-10-25 13:45:22 +08:00
@explon
SELECT COUNT(DISTINCT `t`.`id`) FROM `vt_crm`.`customerusers` `t`
LEFT OUTER JOIN `vt_crm`.`customer` `sales`
ON (`t`.`customerid`=`sales`.`id`)
WHERE ((gradeid='5') AND (sales.enable='1'))

t表家里customer的id跟gradeid加了联合索引
sales的id跟enable也加了联合索引,现在1.6秒了~
napoleonu
2012-11-01 19:55:07 +08:00
LZ貌似没理解 LEFT OUTER JOIN ,你这条语句和

SELECT COUNT(DISTINCT `t`.`id`) FROM `vt_crm`.`customerusers` `t` WHERE (gradeid='5') ;

没分别。
ElmerZhang
2012-11-02 10:27:45 +08:00
customerusers 的 id 不是主键?如果是的话没必要加 distinct
gradeid 是哪个表的字段?
下面这四行貌似都没用,可以去掉
LEFT OUTER JOIN `vt_base`.`cate` `cate`
ON (sales.cateid = cate.id)
LEFT OUTER JOIN `vt_base`.`city` `city`
ON (city.id = sales.cityid)
kchum
2012-11-02 11:36:01 +08:00
@ElmerZhang gradeid 是customerusers的字段,id是主键。好像倒也是啊。

@napoleonu 现在想想,还真是没区别~这条语句是同事写的,我都蒙了~~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/50854

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX