那么挑战来了,这条 sql 还能有更优化性能的写法吗?

2016-06-15 17:04:10 +08:00
 teemoer

http://ww3.sinaimg.cn/large/e38a7f8bgw1f4w0tyljcuj20kt0k1juw.jpg

SELECT m.id, m.name, mc_diag.count_size AS mc_diag_count, mc_thers.count_size AS mc_thers_count, mc_me.count_size AS mc_me_count FROM medicine m LEFT JOIN medicine_count mc_diag ON mc_diag.medicine_id = m.id AND mc_diag.doctor_id = 47 AND mc_diag.diagosis_name = '急性上呼吸道感染' LEFT JOIN medicine_count mc_me ON mc_me.medicine_id = m.id AND mc_me.doctor_id = 47 LEFT JOIN medicine_count mc_thers ON mc_thers.medicine_id = m.id AND mc_thers.doctor_id <> 47 WHERE (m.name LIKE '%w%' OR m.help_code LIKE '%w%') AND m.type = 0 GROUP BY m.name ORDER BY mc_diag_count DESC, mc_me_count DESC, mc_thers_count DESC, m.id DESC LIMIT 0, 10;

########################################## 鄙人的智商也就这么多了,诸位 SQL 大神多多指教

6193 次点击
所在节点    MySQL
69 条回复
teemoer
2016-06-15 18:42:38 +08:00
teemoer
2016-06-15 18:43:25 +08:00
@500miles == 1 2 3 三种情况来 计算出 每种条件的得出条数的 SIZE 进行 order by. ..
teemoer
2016-06-15 18:44:02 +08:00
@ango 好的 也是打算这样处理 = = 暂时还没思路
petelin
2016-06-15 18:44:08 +08:00
联多表一条 sql 慢一点的也不超过 10ms ,拆成多个在语言里写 for 大多 30 、 50ms 。
teemoer
2016-06-15 18:44:56 +08:00
@murmur join 1 2 3 三种情况来 计算出 每种条件的得出条数的 SIZE 进行 order by. ..
teemoer
2016-06-15 18:46:58 +08:00
@fireapp 抱歉 没听多大懂哦 0.0
howeroc
2016-06-15 18:48:36 +08:00
之前 group by 查出结果要 20 多秒,然后建了一个表,每 5 分钟跑一次定时任务。然后每次查询 0.02 秒。。。
teemoer
2016-06-15 18:48:53 +08:00
@welefen 0.0 没思路 能稍微 提示提示吗
teemoer
2016-06-15 18:50:46 +08:00
@howeroc 0.0 我这条语句里面 group by 之前都有筛选条件.... 无法在 查询之前就把某些数据提前提取出来哇 ...
omengye
2016-06-15 18:51:30 +08:00
话说没有用视图合并的么…
kamushin
2016-06-15 18:55:48 +08:00
@petelin 10ms 是在 DB 上, 30ms 是在应用服务器上,这能一样么。一个 DB 服务器要接入多少应用服务器。
petelin
2016-06-15 18:59:48 +08:00
@kamushin 不是啊, django 有一个 debug toolbar ,可以看 一次请求处理过程中 mysql 消耗的时间,我说的 30 秒就是数据库查询的时间,
代码当时这么写的
For id in 一次查询:
Sql 语句 where userid = id

这样就会很慢
petelin
2016-06-15 19:00:04 +08:00
fireapp
2016-06-15 19:01:55 +08:00
@teemoer 如果有两条数据
| id | name | other |
| :-: | :-: | :-: |
| 1 | abc | o1 |
| 2 | abc | o2 |
当 select id, name, other from table group by name
可能会得到 id = 1 的那条数据
也可能会得到 id = 2 的那条数据
最坏的是得到 1, abc, o2 或 2, abc, o1 这种结果
不知道这些结果是不是你业务所需要的
teemoer
2016-06-15 19:06:55 +08:00
@fireapp 明白了 , 3Q
zsx
2016-06-15 19:10:21 +08:00
@petelin 你这种难道不应该一次查询取出所有 ID 然后合到一条查询里进行么……
cxbig
2016-06-15 19:14:53 +08:00
看上去是统计医生开药算提成的代码,这个行业多半是灰色地带吧。。。提供技术支持算不算犯罪?
strwei
2016-06-15 19:25:16 +08:00
索引用 sphinx 优化试试
teemoer
2016-06-15 19:33:35 +08:00
@cxbig = = ! 我去 你直接把我吓到了
sampeng
2016-06-15 19:37:32 +08:00
不说数据量,谈优化都是耍流氓

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

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

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

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

© 2021 V2EX