有学员问: 最近在某平台学习一个关于oracle SQL优化培训课程中,听讲师在讲到not in的知识点时说:“not in的子查询是不等于的关系,不能用索引。...我本人是非常赞同上面的说法,但是在对上面这些理论的解读上,网上还有其他一些专家说法, 我认为不是太恰当,为了避免这些文章误导广大读者,下面列举几个网上我认为不太准确的观点: 1.not in 和 not...有时候虽然事实上没有null记录,not in和not exists两种写法得到的结果集也相同,但是优化器不敢冒险,为了保证结果集的准确,不得不为两种写法生成不同的执行计划。...” 虽然下面两个查询返回的结果集相同,但是二者在逻辑上本来不等价(一旦主查询或子查询的关联字段上有null值,结果集就不同了),因为原培训材料就是在不考虑列是否为空的情况下做的比较,我就顺着这个思路给出了下面...null的T1表,还是先扫描了结果集较小的T2表(符合hash join的特点),这个执行计划说明了说法4的第一个描述是不准确的; 再来看看说法4的第二个描述,如果发现子查询T1表没有null值, 会选择
这里,我给你简单介绍一下MySQL采样统计的方法。 为什么要采样统计呢?因为把整张表取出来一行行统计,虽然可以得到精确的结果,但是代价太高了,所以只能选择“采样统计”。...采样统计的时候,InnoDB默认会选择N个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数。 而数据表是会持续更新的,索引统计信息也不会固定不变。...干涉优化器选择:写成子查询 还有什么办法?我们可以用子查询,在子查询里先走city_id和type的联合索引,得到结果集后在limit1选出第一条。...总结 本文带大家回顾了一次MySQL优化器选错索引导致的线上慢查询事故,可以看出MySQL优化器对于索引的选择并不单单依靠某一个标准,而是一个综合选择的结果。...我自己也对这方面了解不深入,还需要多多学习,争取能够好好的做一个索引选择的总结(挖坑)。不说了,拿起巨厚的《高性能MySQL》,开始... 压住我的泡面...
这里,我给你简单介绍一下MySQL采样统计的方法。 为什么要采样统计呢?因为把整张表取出来一行行统计,虽然可以得到精确的结果,但是代价太高了,所以只能选择“采样统计”。...采样统计的时候,InnoDB默认会选择N个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数。 而数据表是会持续更新的,索引统计信息也不会固定不变。...干涉优化器选择:写成子查询 还有什么办法?我们可以用子查询,在子查询里先走city_id和type的联合索引,得到结果集后在limit1选出第一条。...总结 本文带大家回顾了一次MySQL优化器选错索引导致的线上慢查询事故,可以看出MySQL优化器对于索引的选择并不单单依靠某一个标准,而是一个综合选择的结果。...我自己也对这方面了解不深入,还需要多多学习,争取能够好好的做一个索引选择的总结(挖坑)。
可当我因疲劳过度晕倒后,再次醒来,我穿越到了一个 MySQL 还没诞生的世界,需要在这个世界完成一系列任务,设计一款数据库 MySQL,《重生之从零设计 MySQL 架构》,就能就能回到原来的世界,迎娶白富美...为了启动项目,我决定以一条最基础的 SELECT 查询作为突破口,去组建一个 MySQL 团队,干翻这苍穹!...优化器:MySQL 会根据统计信息和成本模型,为 SQL 语句选择一个最佳的执行计划。执行计划包括了连接顺序,访问方法,索引选择,排序策略等。 需要注意的是,我可以让优化器使用缓存来提高查询速度。...子查询往往需要运行重复的查询,子查询生成的临时表上也没有索引,因此效率会更低。 连接查询可以利用索引加速。 王妮玛:你如何评估执行成本?...这些行数会影响成本模型中的 I/O 代价和 CPU 代价。 预估成本:优化器会根据预估行数和成本常数(cost constant)来预估每个执行计划的成本。 就这样,得到一个执行计划。
很多人把它称为一种“胶水”语言,通过大量丰富的类库、模块,可以快速搭建出自己需要的工具。 于是乎,这个小工具就成了我学习Python的第一个作业,我把它称之为“MySQL语句优化辅助工具”。...DEPENDENT SUBQUERY 子查询内层的第一个SELECT,依赖于外部查询的结果集。...PRIMARY 子查询中的最外层查询,注意并不是主键查询。 SIMPLE 除子查询或UNION之外的其他查询。 SUBQUERY 子查询内层查询的第一个SELECT,结果不依赖于外部查询结果集。...UNION RESULT UNION中的合并结果。从UNION临时表获取结果的SELECT。 DERIVED 衍生表查询(FROM子句中的子查询)。MySQL会递归执行这些子查询,把结果放在临时表里。...unique_subquery 子查询中的返回结果字段组合是主键或唯一约束。 index_subquery 子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个主键或唯一索引。
的结果) (6) SUBQUERY(子查询中的第一个SELECT) (7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,取决于外面的查询) (8) DERIVED(派生表的SELECT..., FROM子句的子查询) (9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行) table 显示这一行的数据是关于哪张表的,有时不是真实的表名字...,看到的是derivedx(x是个数字,我的理解是第几步执行的结果) 我这里显示的是表的别名 type 表示MySQL在表中找到所需行的方式,又称“访问类型”。...对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。...这里的关键是为什么要收集数据,原因在于:mysql使用“索引”完成查询结束后,mysql得到了一堆的行id,如果有的列并不在索引中,mysql需要重新到“数据行”上将需要返回的数据读取出来返回个客户端。
MySQL在执行查询的时候有哪些子任务,这个是有一定的方法进行剖析的,具体方法下回单独拿一个章节来分析。...确认MySQL服务器层是否在分析大量超过需要的数据行。...1.1、是否向数据库请求了不需要的数据 在访问数据库时,应该只请求需要的行和列,请求多余的行和列会消耗MySQL服务器的CPU和内存资源,并增加网络开销。...二、重构查询的方法 设计查询的时候需要考虑是否需要把一个复杂的查询分成多个简单的查询。在我的印象中,曾经无数次听到一个经验法则:可以在数据库中做的事不要放在应用程序中,数据库比我们想象的要厉害的多。...这个方法我一直在用。 另一个例子是分解关联查询,即对每个要关联的表进行单表查询,然后将结果在应用程序中进行关联。我在之前一家公司和一位在阿里待过很多年的同事一起编码时,他就是这么干的。
比如,它会检查表和列名是否存在,检查名字和别名,保证没有歧义。 预处理之后得到一个新的解析树。 查询优化器(Query Optimizer)与查询计划 得到解析树之后,是不是执行SQL语句了呢?...一条SQL语句是可以有很多种执行方式的,最终返回相同的结果,他们是等价的。但是如果有这么多种执行方式,这些执行方式怎么得到的?最终选择哪一种去执行?根据什么判断标准去选择?...开始后面所有select SUBQUERY 子查询中的第一个SELECT,结果不依赖于外部查询 DEPENDENT SUBQUERY 子查询中的第一个SELECT,依赖于外部查询 DERIVED 派生表的...SELECT, FROM子句的子查询 UNCACHEABLE SUBQUERY 一个子查询的结果不能被缓存,必须重新评估外链接的第一行 table 显示这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的...就是多表连接中使用primary key或者 unique key作为关联条件 const、system 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。
Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间,还需要mysql内部进行特殊处理。...= 等负向条件查询在有 NULL 值的情况下返回永远为空结果,查询容易出错。...,"zhaoliu_2_2"),(3,"wangmazi_2_2")insert into table_3 values (1,"zhaoliu_2_1"),(2, null)-- 1、NOT IN子查询在有...,结果集中不会包含这些记录。...5、注意 Null 字段的判断方式, = null 将会得到错误的结果。 (5)Null 列需要更多的存储空间:需要一个额外字节作为判断是否为 NULL 的标志位。
通过上面这些参数执行结果的统计,我们能够大致了解到当前数据库是以更新(包括插入、删除)为主还是查询为主。 除此之外,还有一些其他参数用于了解数据库的基本情况。...包括线程的状态、是否锁表等,可以实时的查看 SQL 执行情况。同样,使用mysqladmin processlist**语句也能得到此信息。...SUBQUERY:子查询中首个SELECT(如果有多个子查询存在),如我们上面的查询语句,子查询第一个是 sr(sys_role)表,所以它的 select_type 是 SUBQUERY。...图片 关于设置索引但是索引没有生效的场景还有很多,这个需要小伙伴们工作中不断总结和完善,不过我上面总结的这些索引失效的情景,能够覆盖大多数索引失效的场景了。...1、MySQL 分析表 分析表用于分析和存储表的关键字分布,分析的结果可以使得系统得到准确的统计信息,使得 SQL 生成正确的执行计划。
在我们的记忆储备里也早已记住了这些关键词:避免使用SELECT*、避免使用NULL值的判断、根据需求适当的建立索引、优化MySQL参数......但是你对于这些优化技巧是否真正的掌握了及其相应的工作原理是否吃透了呢...我觉得还有待考察。所以,本文将详细介绍MySQL优化技巧以及其相应的技术原理,希望大家看完以后,能更清楚直接的了解这些优化方案,并应用到我们的工作岗位中。...查询缓存 在解析一个查询语句前,如果查询缓存是打开的,那么MySQL会检查这个查询语句是否命中查询缓存中的数据。如果当前查询恰好命中查询缓存,在检查一次用户权限后直接返回缓存中的结果。...在MySQL可以通过查询当前会话的 last_query_cost的值来得到其计算当前查询的成本。...看了以上原理,想必你现在已经很清楚MySQL的运行原理了,接下来我将从一下这些方面对其进行优化。
要想使python可以操作mysql 就需要MySQL-python驱动,它是python 操作mysql必不可少的模块。...cmd进入MySQL-python-1.2.5目录: >>d: >>cd MySQL-python-1.2.5 >>python setup.py install 测试非常简单,检查MySQLdb 模块是否可以正常导入...那怎样才能获得表中的数据呢?...,所以,我再次执行的时候得到的是第二条数据。...,通过一个for循环就可以把多条数据打印出啦!
3、table :对应行正在访问哪一个表,表名或者别名(注意:MySQL对待这些表和普通表一样,但是这些“临时表”是没有任何索引的); 关联优化器会为查询选择关联顺序,左侧深度优先 当from中有子查询的时候...我们通常根据该列的值来判断SQL语句是否需要优化; ?...根据上面的知识分析: 我通过MySQL EXPLAIN分析的思路是这样的:通常首先要根据id的值确定当前检索语句是何时执行的,注意分析的时候按顺序分析,其次在根据type列的值来判断当前检索语句是否需要优化...因为我上面的那条语句是一个子查询,所以我首先根据id的值找到最先执行的检索语句,也就是嵌套在最内层的那条等值查询语句,它分别使用等值条件去连接企业表和上传数据表筛选出符合条件的数据,但是使用EXPLAIN...;最后看到最外层的检索语句也未必是高效的,它关联的地区表也进行了全表数据匹配,但是我要的查询结果是根据子查询结果来得出的,肯定不比子查询结果的数据多,所以我将子查询结果作为左表去匹配地区表中的数据,果然
其实这篇文字写的有点费劲,我大约一天的时间,没有得到答案,到底什么时候能走ICP。所以下面是我通过大约一天的测试后得到的结果。 索引条件下推(ICP)是MySQL使用索引从表中检索行的一种优化。...如果没有ICP,存储引擎将遍历索引来定位基表中的行,并将它们返回给MySQL服务器,MySQL服务器将计算这些行的WHERE条件。...仅仅服务于二级索引,主键查询时走不了ICP的,(问题是我查询时差的非主键,使用的也是二级索引,为啥还不走) 4 ICP 不支持在虚拟列上创建的二级索引 (我是实体列,为啥不走) 5 条件是子查询的走不了...(我不是子查询,为啥不走) 6 条件是函数,也不能走 (我不是函数,我给了具体的值,为啥还不走) 7 触发条件的不能走 (我不是,为啥还不走) 上面的符合5.7 上列出来不能走ICP的条件,上图中的查询也符合走...(估计这样说,我也看不明白我说什么,画一张图),通过图可以看到,一般走ICP的时候,大部分情景都是非索引的条件,比走索引更能定位要查询最终的结果,同时走索引还是可以排除一大部分数据的情况下,否则就走全表扫描了
上篇博客,我们详细的说明了mysql的索引存储结构,也就是我们的B+tree的变种,是一个带有双向链表的B+tree。那么我今天来详细研究一下,怎么使用索引和怎么查看索引的使用情况。...一般来说使用主键索引是const,system一般是不需要再次查表就可以得到的sql。...在这种情况下,可以通过检查 where 子句看是否可 以创造一个适当的索引来提高查询性能,然后用 explain 查看效果。 key列: 这一列显示mysql实际采用哪个索引来优化对该表的访问。...,where条件中是一个前导列的范围; Using temporary:mysql需要创建一张临时表来处理查询。...留一个思考题,为什么我们在建表的时候需要设置字段不为空。 索引优化的路还很长,后面我会详细的说mysql的索引优化处理。
创建和删除一个多级目录? 在当前用户家目录中查找haha.txt文件? 如何查询出tomcat的进程并杀掉这个进程,写出linux命令? 动态查看日志文件? 查看系统硬盘空间的命令?...判断 101-200 之间有多少个素数,并输出所有的素数 一个输入三角形的函数,输入后输出是否能组成三角形,三角形类型,请用等价类- 划分法设计测试用例 … 四、MySQL数据库 你用的Mysql是哪个引擎...如何对查询命令进行优化? 数据库的优化? Sql注入是如何产“生的,如何防止? NoSQL和关系数据库的区别? MySQL与MongoDB本质之间最基本的差别是什么 Mysql数据库中怎么实现分页?...在我的机器端口4444不是免费的。我怎样才能使用另一个端口? 什么是Selenium Server,它与Selenium Hub有什么不同? 你如何从Selenium连接到数据库?...一个测试工程师应具备哪些素质和技能? 还有问一下你是怎样保证软件质量的,也就是说你觉得怎样才能最大限度地保证软件质量? 为什么选择测试这行? 如果我雇用你,你能给部门带来什么贡献?
我们这里通过一条SQL的大体执行路径来看一下这些功能之间的关系:应用程序通过MySQL客户端向SQL引擎发送了一条SQL,SQL引擎通过协议解析,从数据包中得到这条SQL,并对这条SQL进行语法解析,语法解析以后我们就得到一棵抽象的语法树...如果我们增加了这个order by,SET1和SET2返回的结果都是按名字有序地进行,SQL引擎进行一个简单的Merge就可以得到一个全局有序的结果。...SQL先将T1、T2进行一个等值连接,然后where条件指定了T1.A是一个常量;在这里还有一个子查询——这个子查询是一个相关子查询,它引用了外层的T1.C。...4.2 explain信息解读 在使用MySQL的时候,我们经常使用的命令就是explain,通过explain我们可以看到查询的执行计划,看到这条SQL是否使用了某个索引,或者说多表连接的顺序是否符合预期...好了,今天我的分享就到这里了。谢谢大家! Q&A Q:SQL引擎是自己开发的还是用的MySQL的引擎? A:SQL引擎是我们自己开发的。
包括线程的状态、是否锁表等,可以实时的查看 SQL 执行情况。同样,使用mysqladmin processlist语句也能得到此信息。 ?...关于设置索引但是索引没有生效的场景还有很多,这个需要小伙伴们工作中不断总结和完善,不过我上面总结的这些索引失效的情景,能够覆盖大多数索引失效的场景了。...MySQL 分析表 分析表用于分析和存储表的关键字分布,分析的结果可以使得系统得到准确的统计信息,使得 SQL 生成正确的执行计划。...优化嵌套查询 嵌套查询是我们经常使用的一种查询方式,这种查询方式可以使用 SELECT 语句来创建一个单独的查询结果,然后把这个结果当作嵌套语句的查询范围用在另一个查询语句中。...使用时子查询可以将一个复杂的查询拆分成一个个独立的部分,逻辑上更易于理解以及代码的维护和重复使用。 但是某些情况下,子查询的效率不高,一般使用 join 来替代子查询。
作为结果: ? 因为WHERE消除了条件不为TRUE的行,所以消除了房屋A。从SQL的角度来看,上面两个SELECT的结果是正确的。现在轮到您决定它们是否符合您的期望。 如果符合预期,那么一切都很好。...“ NOT IN(子查询)”也会发生相同的问题。让我们添加此表: ? 查询加热不产生二氧化碳的房屋: ? >没有结果。 再次缺少A。同样,解决方案是: ? 现在我得到A。...我可以改写为NOT EXISTS,但这是需要更多的编辑工作: ? 这也返回A。 如果我做两次重写中的任何一个,我就会以某种方式向MySQL声明我希望NULL是我的NOT IN的明确匹配项。...我们可以在EXPLAIN中进行检查;首先,我们有一个初始的NOT IN,其中一个查询计划显示每个房屋执行一个子查询,并且每次都进行表扫描(这效率很低): ?...要获得一百万个房屋,我只需要重复上一次的INSERT几次。现在我的搜索查询时间是: ? 反联接计划以更少的百分之二十的时间返回更多的行(如预期的那样,包括NULL)。
领取专属 10元无门槛券
手把手带您无忧上云