MySQL关联查询和子查询优化

MySQL关联查询和子查询优化策略在运行MySQL关联查询时,使用外连接时,选择小表作为驱动表,大表作为从动表,以减少外部循环次数。
当执行内连接时,MySQL会自动选择结果集较小的表作为引导表,无需人工干预。
首先为驱动表创建索引,连接字段类型必须一致,避免索引失败。
相关查询会覆盖子查询以减少查询数量。
多个查询覆盖子查询以提高执行效率。
执行左外连接时,先创建右表索引,并且连接字段类型保持一致。
选择右表创建索引,因为左表查询所有数据,而右表根据条件查询,索引值较高。
连接字段类型必须一致,避免隐式类型转换导致索引失败。
使用EXPLAIN分析左外连接并观察查询优化。
优化后可以看到类型从全表扫描(All)变为引用索引(ref)并且行数减少,说明索引优化很明显。
在左表上创建索引还可以优化查询,并且可以通过阴影看到驱动表的变化。
删除索引后,根据数据量重新选择驱动表。
内连接时,控制表由数据量和索引决定。
查询优化器根据查询成本选择驱动表,通常是一个小表作为驱动表。
检查内连接优化时,可以添加或删除索引并观察驱动表的变化。
MySQL5.5版本引入了BNLJ算法来优化嵌套循环连接的执行,并通过驱动表和从动表的概念来优化连接过程。
通常,优化器会根据查询语句自动选择驱动表,并通过explain关键字将其可视化。
测试发现,基于选择的表不一定是A,优化器会根据实际的查询语句进行优化。
简单的嵌套循环连接算法效率低下。
通过索引使用嵌套循环连接优化要求驱动表具有索引。
通过外表匹配条件直接匹配内表索引,减少内存表匹配次数。
引导表中的每条记录都是通过从动表的索引来访问的,记录数较少的表作为引导表(外观)。
BlockNested-LoopJoin算法优化了连接过程,并缓存关联表的列和选择后面的列。
在具有N个连接关联的SQL中分配N-1个连接缓冲区,以减少不必要的字段查询并增加连接缓冲区大小。
一次索引的数据越多,内部数据包扫描就越少。
HashJoin是连接大型集合的常用方法的数据。
优化器使用较小的表创建哈希表,分析较大的表并检测哈希表。
适用于内存中放置较小表的情况。
当表太大而无法完全放入内存时,会将其分为多个分区,并将无法放入内存的部分写入磁盘的临时段,从而需要更大的临时段以提高性能。
HashJoin适用于没有索引或并行查询的大型表,提供最佳性能。
子查询优化包括拆分查询或优化为连接查询,从而减少临时表的创建,提高执行速度。
建议使用LEFTJOINxxxONxxWHERExxISNULL代替NOTIN或NOTEEXISTS,以避免子查询造成的性能影响。

MySQL查询语句:子查询的使用

子查询定义查询问题中的成绩表为SC。
这些字段是学号s_id、课程号c_id、成绩分数,除以所有平均成绩大于或等于85的学生的学号、课程号和成绩。
两个阶段。
第一步计算平均成绩大于等于85分的学生的学号查询结果结果:第二步找到上一步得到的学号的结果信息查询:最后两条查询语句将第二个查询中的“01”和“07”整合在一起并用第一个查询语句替换。
第一个子查询已编写。
该查询已获知数字“01”,并且还获知数字“02”。
对于课程的学生人数,首先查找学习课程01的学生人数,然后查找学习课程02的学生人数。
学习过课程01的学生和学习过课程02的学生就是上面两个查询结果的交集。
使用两个条件,连接结果如下:按平均成绩从高到低显示所有学生在所有课程中的成绩。
而平均分需要用成绩和平均分来显示,首先求出每个学生的平均分,结果如下:将上述查询结果与成绩表横向连接后,连接字段为s_id。
并且子查询的结果用作新表,连接到现有表时,必须给出别名。
(使用多表连接在另一篇文章中详细介绍)结果如下:上面的查询都是标量子查询。
外层查询不会影响内层查询的结果。
相关子查询的情况如下:使用相关子查询解决排序问题(1):zhuanlan.zhihu.com/p/85...使用相关子查询解决排序问题(2):zhuanlan.zhihu.com/p/85...

mysql数据库如何用一条语句同时查多个数据库