语句如下,其中shop_id建立了索引,扫描行数712127行:
select
id,
material_id,
cnt,
stock_cnt,
status,
type,
gmt_deadline,
sale_type,
gmt_gen
from
stock_count
t
where
t
.shop_id
= '330547’
and t
.brand_id
= '100148’
and t
.status
in (0, 2)
and t
.is_init
= 0
and t
.type
in (2, 1, 3)
and t
.sale_type
in (0, 1)
order by
id
desc
LIMIT
0, 1
查询语句贴出来。
或者换用postgresql 试试
找到慢的原因
来自酷炫的 CNodeMD
@JavaHello 这就是我迷惑的地方。我用promise.all批量执行这条sql。我该怎么监控MySQL服务器才能找出最慢的那条sql慢的原因呢。
第一:找出哪条慢。 每一次查询肯定有一个单独的io,你在单独的对象上增加时间戳,然后结束时打印出它的耗时。 第二:优化。sql语句是不是固定不变的?如果是,能不能写成存储过程或者预编译?这一类做法可以减少数据库解析sql语句的时间。 第三:检查是否是数据连接池问题。数据连接池默认有最大连接数限制。 你一次执行50条,如果你的最大连接数是10,那你一次只能执行10条,其它的都在排队,等于说你的50条并没有真正的并行。
@Gitforxuyang 1.这个统计时间是mysql服务器统计出来的,不是js后端代码统计出来的,也就是说,和连接数没关系,这纯粹就是sql在mysql服务器的执行起始时间到sql结束时间。2.做成存储过程或者预编译可能会带来速度提升,但是我现在最想知道这条sql慢的原因,为啥单独执行就非常快
问题关键在于为什么要执行50次查询,应用程序设计有问题哈
5s,不能忍
@zhhb 全国10000家门店,只要有50家门店一起访问这个界面就达到这个效果了
@zhulinwei 不能忍
1. shop_id 应该是唯一的吧,如果是唯一的,为什么还扫描了70W行数据?说明你的索引没用?
2. 如果shop_id 不唯一,能否给其他具有较大离散度的字段建索引。
3.楼上有人说用存储过程,个人觉得:sql编译也用不了这么长的时间,改为存储过程可能优化效果不明显。。个人猜测。
4.总数据量有多少?
5.把explain 分析的结果贴出来看看。。
mysql 这种烂货要么堆硬件(上固态盘)要么就别花成本去折腾直接换数据库吧, 免费的 pgsql ,商业的 oracle 。
1、in 查询用的太多 2、建议其他常用字段也增加索引
为什么库存表 商品id不给索引 brand是品牌?这个也要建索引啊 type status这些常用查询条件也要索引吧
剔除一两个条件,在应用层再进行操作
来自酷炫的 CNodeMD
顺便问下怎么会有这种sql呢: 以 id 字段做 GROUP BY,而输出字段中非 id 字段 (material_id, cnt, stock_cnt, status, type, gmt_deadline, sale_type, gmt_gen) 是直接输出而非聚合函数处理结果?
又是一个被mysql荼毒的mysqler ……
@waitingsong 兄弟,那是order by 不是 group by
@linxiaoziruo 哦,看错了……
批量查询可以考虑缓存数据,比直接每次都从数据库查询应该要快很多
@linxiaoziruo 看看查询是否有索引和扫描的行数。注意查询条件换一下,可能是MySQL有缓存
来自酷炫的 CNodeMD