mysqljoin快还是内存循环

mysqljoin快还是内存循环,第1张

在MySQL中,根据查询的复杂程度,使用内存循环或者MySQL Join可以有效提高查询效率。内存循环是指在MySQL中使用内存中的数据进行循环,而MySQL Join是指在MySQL中使用多个表之间的连接来查询数据。

内存循环的优点是可以更快地查询数据,因为它只需要在内存中进行循环,而不需要在数据库中进行查询。但是,它的缺点是只能处理少量数据,而且它只能处理简单的查询,不能处理复杂的查询。

MySQL Join的优点是可以处理复杂的查询,因为它可以在多个表之间进行连接,从而查询出更多的数据。但是,它的缺点是查询效率较低,因为它需要在数据库中进行查询,而不是在内存中进行查询。

总的来说,在MySQL中,根据查询的复杂程度,使用内存循环或者MySQL Join可以有效提高查询效率。

子查询优化策略

对于不同类型的子查询,优化器会选择不同的策略。

1. 对于 IN、=ANY 子查询,优化器有如下策略选择:

semijoin

Materialization

exists

2. 对于 NOT IN、<>ALL 子查询,优化器有如下策略选择:

Materialization

exists

3. 对于 derived 派生表,优化器有如下策略选择:

derived_merge,将派生表合并到外部查询中(5.7 引入 );

将派生表物化为内部临时表,再用于外部查询。

注意:update 和 delete 语句中子查询不能使用 semijoin、materialization 优化策略

现象:列表页因超时查不出来东西,使用postman模拟请花费40多秒,将sql语句单独提出来后查询速度非常慢,40多秒

先上结论:

在两个表关联字段上建立索引解决此问题,下面的内容比这句话爽多了,请继续看

表结构如下:

users(用户)表:id,name

integal_record(分数记录)表:id,user_id,integal_id

其中,integal_record表的user_id关联着users表的id,业务目的是查询每个员工阅读次数、评论次数和积分总和,查询语句如下:

(里面写死的值是我从mybatis里扣出来的)

integral_id=1代表着阅读,integral_id=2代表着评论

查询时间快半分钟是无法让人接受的,从表象的SQL语句来说,首先我们看到有很多SUM函数,因此我们来测试下SUM函数的计算时间,如下查询每个人阅读的累计次数:

可以看出来计算时间很长和SUM函数没什么关系,再看整个SQL除了一些SUM函数外就剩下users表左联integal_record表,我们把条件去掉,直接就写个左查询试试

amazing,我的users表里有13400条数据,关联的integral_record 表里也有13000条数据,仅仅做了左连接竟然花费了70秒,这肯定是超时的元凶;所以我们explain一下,看看mysql对这条数据的查询策略:

查看结果:

我们看到type字段的结果是All,也就是代表全表扫描,那么就好办了,建立索引即可,其中users表中的id属于主键,策略自增,有默认的索引,不在考虑范围内,我们仅需对integral_record表增加索引即可:

继续执行左联语句查看运行时间:

时间仍然很久,索引并没有起作用,这里排除一些逃避困难时的迷信想法:mysql有bug 或者navicat有bug,有网络问题 哈哈哈.....我们来看左联的关键属性:

执行时间从60多秒变成了0.375s,整个世界都安静了,再次explain一下

发现mtemp(integal)表的检索方式从all变成了ref,索引,快的一批,深呼吸....

希望继续遇到这种sql需要优化的问题来增加sql调优相关经验


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5899043.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-07
下一篇 2023-03-07

发表评论

登录后才能评论

评论列表(0条)

保存