首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Mysql连接查询时查询条件放在On之后和Where之后的区别

探究 利用廖雪峰提供的在线工具,利用student表和classes表我们做一个测试, student表 classes表 1.统计每个班级中女生的数量 问题SQL select a.name,...* FROM LT LEFT JOIN RT ON P1(LT,RT)) WHERE P2(LT,RT) 其中P1是on过滤条件,缺失则认为是TRUE,P2是where过滤条件,缺失也认为是TRUE,...that P1(lt, rt) {// 遍历右表每一行,找到满足join条件的行 IF P2(lt, rt) {//满足 where 过滤条件 t:=lt||rt;//合并行,输出该行...on 后跟关联表(从表)的过滤条件,where 后跟主表或临时表的筛选条件(左连接为例,主表的数据都会查询到,所以临时表中必定包含主表所有的字段,需要给主表加什么筛选条件,直接给临时表加效果相同) 总结...通过上面的问题现象和分析,可以得出了结论:在left join语句中,左表过滤必须放where条件中,右表过滤必须放on条件中,这样结果才能不多不少,刚刚好。

1.7K10

谈谈SQL查询中回表对性能的影响

运营反馈某个功能速度很慢,查了一下,定位到如下 SQL: select id from user where name like ‘%foobar%’ order by created_at limit...10; 业务需要,LIKE 的时候必须使用模糊查询,我当然知道这会导致全表扫描,不过速度确实太慢了,直观感受,全表扫描不至于这么慢!...我使用的数据库是 PostgreSQL,不过它和 MySQL 差不多,也可以 EXPLAIN: SQL With LIMIT 如上所示:先按照 created_at 索引排序,再 filter 符合条件的数据...出于经验主义,我去掉了 limit 再执行: select id from user where name like ‘%foobar%’ order by created_at; 果不其然,速度快了好几倍...要想搞清楚缘由,你需要理解本例中 SQL 查询的处理流程:当使用 limit 时,因为只是返回几条数据,所以优化器觉得采用一个满足 order by 的索引比较划算;当不使用 limit 时,因为要返回所有满足条件的数据

2.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是:

    目录 1 编写顺序 1 编写顺序 当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是: 1.执行where xx对全表数据做筛选,返回第1...2.针对第1个结果集使用group by分组,返回第2个结果集。 3.针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集。...Group By 和 Having, Where ,Order by这些关键字是按照如下顺序进行执行的:Where, Group By, Having, Order by。...-- 3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩 select b.s_id,b.s_name,ROUND(AVG(a.s_score),2) as avg_score from...score a on b.s_id = a.s_id GROUP BY b.s_id,b.s_name HAVING avg_score >=60; 根据题意,需要用到信息表 成绩表 首先查出有成绩的学生

    84320

    干货 | 携程酒店慢查询治理之路

    查询不带where条件 不带where条件直接查询\修改全表是很危险的操作,表数据量够大的话,尽量拆分成多批次操作。...分批可以采用分段拉取减少扫描的行数,如果分段拉取不连续的话可以传入上一次拉取最大的值作为下一次的起始值: 最大最小值写法 由于where条件的字段数据分布问题,会导致max和min的查询非常慢: explain...排序聚合写法 通常SQL在使用Group by及Order by后,会产生临时表和文件排序操作。若查询条件的数据量非常大,temporary和filesort都会产生额外的巨大开销。...*注意从MySQL 8.0开始,不会再有这种情况了,因此不需要ORDER BY NULL写法了 (4)资源 锁资源等待 在读写很热的表上,通常会发生锁资源争夺,从而导致慢查询的情况。 a....但是经过长期优化后发现,仅仅从数据库层面优化,并不能实现慢查询完全“清零”,还有很多的痛点来自于业务逻辑和应用层面本身。

    75630

    explain各字段的含义

    另: key_len只计算where条件用到的索引长度, 而排序和分组就算用到了索引,也不会计算到key_len中. 9.ref 如果使用常数等值查询, 这里会显示const; 如果是连接查询, 被驱动表的执行计划这里会显示驱动表的关联字段...即不需要进行filesort Using temporary: 查询有使用临时表, 一般出现于排序, 分组和多表 join 的情况, 查询效率不高, 建议通过优化去掉....where:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据 using index 好于 using where 好于 using index condition, 不需要回表查询数据...[1] mysql 索引type介绍[2] MySQL优化:定位慢查询的两种方法以及使用explain分析SQL[3] limit 会对explain的type产生巨大影响 关于order by的优化...具有LIMIT和不具有LIMIT的ORDER BY可能是不同的 file_sort优化器会预先分配固定数量的sort_buffer_size字节。

    29641

    聊聊PostgreSQL中的几种索引类型

    • 普通类型:与B-Tree类似 • 空间类型:包含 Bloom • 多列:任意列组合,等值查询 • 表达式索引 • 搜索条件为表达式 • where st_makepoint(x,y) op ?...• create index idx on tbl ( (st_makepoint(x,y)) ); • 条件索引(定向索引) • 搜索时,强制过滤某些条件 • where status='active..., 1% 异常数据 索引特性 只有B-tree,GiST,GIN和BRIN索引类型支持多列索引。...在PostgreSQL当前支持的索引类型中,只有B-tree可以产生排序的输出,当ORDER BY与LIMIT n组合:显式排序将必须处理所有数据以识别前n行,但如果存在与ORDER BY匹配的索引,则可以直接检索前...PostgreSQL支持仅索引扫描,当要查询的目标列都在索引中时,直接使用索引中的键值进行返回,不需要回表操作。 技术永无止境,加油吧。 Catch.jpg

    5.3K20

    MySQL如何破解limit 100w+的分页查询

    版本:MySQL 5.7 三、优化前 我们先不进行任何优化处理,直接采用最原始的limit方式查询,如下SQL: select type from order_info where user_id =...1.先查询主键id select id from order_info where user_id = 17898735496 limit 2000000,10 执行结果: > OK > 时间: 0.607s...如果limit index小于1w,就直接查询所有的数据,如果limit index大于等于1w,就采用先查询id,后in条件查询所有数据。...例如: select type from order_info where id > 10000 limit 10 但是这样有个前提就是,id需要是自增长,其次是需要是顺序查询,不能够进行跳页查询,而且还不能有按字段排查的情况...第二步根据id查询数据,那就更快了,基本上秒出来。 当然真实生产中,我们还需要根据实际业务适配对应逻辑,就比如:如果99%的分页不会到1w以上,那基本不会发生这种慢SQL了。

    1K10

    新特性解读 | MySQL 8.0 语句摘要功能介绍

    select * from p1 where id >N-N order by rand() limit N 对慢日志进行过滤分析,按照执行次数排序,拿出前 10 条语句,比如第 1 条语句:...select * from p1 where id > N order by rand() limit N; 这里的 N 代表数字,也就是说无论数字多少,都可以用这条语句来代替。...select * from p1 where id > 1000 order by rand() limit 2; select * from p1 where id > 1000 order by...rand() limit 10; select * from p1 where id > 20000 order by rand() limit 100; 用来代替这几条 SQL 的语句文本叫做摘要文本...现在来用以上两个函数来计算下上面这 3 条 SQL 的摘要。结果和慢日志过滤分析的一样,不过数字 N 变为“?”,这 3 条语句为一个类型,摘要文本一样。

    69241

    千万级数据表选错索引导致的线上慢查询事故

    「可以看到是有idx_city_id_type和idx_1索引的」,我们的查询条件是city_id和type,这两个索引都是能走到的。 但是,我们的查询条件真的只要考虑city_id和type吗?...) where ( ( (1 = 1) and (city_id = 565) ) and (type = 13) ) order by id desc limit 0, 1 这次明显执行的飞快,分析语句...实际上explain的rows是MySQL「预估」的行数,「是根据查询条件、索引和limit综合考虑出来的预估行数。」 MySQL是怎样得到索引的基数的呢?...为何突然出现异常慢查询 问:这个查询语句已经在线上稳定运行了非常长的时间,为何这次突然出现了慢查询? 答:以前的语句查询条件返回结果都不为空,limit1很快就能找到那条数据,返回结果。...「最后做个文章总结:」 该慢查询语句中使用order by id导致优化器在主键索引和city_id和type的联合索引中有所取舍,最终导致选择了更慢的索引。

    1.4K30

    MySQL选错索引导致的线上慢查询事故复盘

    赶紧查看慢SQL记录,发现都是同一类语句导致的慢查询(隐私数据例如表名,我已经隐去): select * from sample_table where 1 = 1 and (city_id...可以看到是有idx_city_id_type和idx_1索引的,我们的查询条件是city_id和type,这两个索引都是能走到的。 但是,我们的查询条件真的只要考虑city_id和type吗?...) where ( ( (1 = 1) and (city_id = 565) ) and (type = 13) ) order by id desc limit 0, 1 这次明显执行的飞快,分析语句...实际上explain的rows是MySQL预估的行数,是根据查询条件、索引和limit综合考虑出来的预估行数。 MySQL是怎样得到索引的基数的呢?...为何突然出现异常慢查询 问:这个查询语句已经在线上稳定运行了非常长的时间,为何这次突然出现了慢查询? 答:以前的语句查询条件返回结果都不为空,limit1很快就能找到那条数据,返回结果。

    98240

    Mysql进阶优化篇05——子查询的优化和排序优化

    这样会消耗过多的 CPU 和 IO 资源,产生大量的慢查询。 子查询的结果集存储的临时表,不论是内存临时表还是磁盘临时表都 不会存在索引 ,所以查询性能会受到一定的影响。...b索引/ WHERE a = const ORDER BY a,d /d不是索引的一部分/ WHERE a in (…) ORDER BY b,c /对于排序来说,多个相等条件也是范围查询/ 2.3 案例实战...age = 30 AND stuno ORDER BY NAME ; 方案二:尽量让 where 的过滤条件和排序使用上索引 建一个三个字段的组合索引: DROP INDEX idx_age_name...当【范围条件】和【group by 或者 order by】的字段出现二选一时,优先观察条件字段的过滤数量,如果过滤的数据足够多,而需要排序的数据并不多时,优先把索引放在范围字段上。反之,亦然。...having,能写在 where 限定的条件就不要写在 having 中了 减少使用 order by,和业务沟通能不排序就不排序,或将排序放到程序端去做。

    2.3K21

    MySQL选错索引导致的线上慢查询事故

    可以看到是有idx_city_id_type和idx_1索引的,我们的查询条件是city_id和type,这两个索引都是能走到的。 但是,我们的查询条件真的只要考虑city_id和type吗?...) where ( ( (1 = 1) and (city_id = 565) ) and (type = 13) ) order by id desc limit 0, 1 这次明显执行的飞快,分析语句...实际上explain的rows是MySQL预估的行数,是根据查询条件、索引和limit综合考虑出来的预估行数。 MySQL是怎样得到索引的基数的呢?...为何突然出现异常慢查询 问:这个查询语句已经在线上稳定运行了非常长的时间,为何这次突然出现了慢查询? 答:以前的语句查询条件返回结果都不为空,limit1很快就能找到那条数据,返回结果。...最后做个文章总结: 该慢查询语句中使用order by id导致优化器在主键索引和city_id和type的联合索引中有所取舍,最终导致选择了更慢的索引。

    2.4K00

    MySQL排序与分页详解

    和“LIMIT 4,3;”返回的结果相同。...使用 LIMIT 的好处 约束返回结果的数量可以减少数据表的网络传输量,也可以提升查询效率 。如果我们知道返回结果只有1条,就可以使用 LIMIT 1,告诉 SELECT 语句只需要返回一条记录即可。...这样的好处就是 SELECT 不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。 拓展 在不同的 DBMS 中使用的关键字可能不同。...在MySQL、PostgreSQL、MariaDB 和 SQLite 中使用 LIMIT 关键字,而且需要放到 SELECT 语句的最后面。...练习题 1.查询员工的姓名和部门号和年薪,按年薪降序按姓名升序显示 SELECT last_name, department_id, salary * 12 annual_salary FROM employees

    1.9K60

    【mysql】limit实现分页

    分页 1. 背景: 背景1:查询返回的记录太多了,查看起来很不方便,怎么样能够实现分页查询呢? 背景2:表里有 4 条数据,如果只想要显示第 2、3 条数据怎么办呢? 2....实现规则 分页原理 所谓分页显示,就是将数据库中的结果集,一段一段显示出来需要的条件。...如果我们知道返回结果只有 1 条,就可以使用LIMIT 1,告诉 SELECT 语句只需要返回一条记录即可。这样的好处就是 SELECT 不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。...在不同的 DBMS 中使用的关键字可能不同。在 MySQL、PostgreSQL、MariaDB 和 SQLite 中使用 LIMIT 关键字,而且需要放到 SELECT 语句的最后面。...练习 查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序显示 SELECT last_name,department_id,salary * 12 annual_salary FROM employees

    3.8K60

    见招拆招-PostgreSQL中文全文索引效率优化

    前言 上文 使用PostgreSQL进行中文全文检索 中我使用 PostgreSQL 搭建完成了一套中文全文检索系统,对数据库配置和分词都进行了优化,基本的查询完全可以支持,但是在使用过程中还是发现了一些很恼人的问题...tsq OR name LIKE 'keyword%' LIMIT 10000) AS tmp ORDER BY score DESC。...---- 替换B树索引消灭慢查询 多索引效率问题 本以为优化到此为止了呢,可是有次在试着查询 中关村 和 东 两个关键词时,我明确感觉到了响应时间的差异, 100ms 左右的时间差还是很明显的。...接着我又尝试改变 SQL 语句的 WHERE 条件,去除 OR name LIKE 'keyword%' 后, 总条数并没有太大的变动,结果集由 13w 减小到了 11w, 但 添加 limit 后的效率却急剧提升...此后,B树索引就可以退休啦~ ---- 小结 以上就是我对 PostgreSQL 关键词查询从效果到效率优化的全过程了,效果和效率已经完全达标了。

    2.5K80
    领券