前面说了子查询里有no/any/all不能用limit,group by,order by等,他会被查询优化器优化掉,子查询可能会物化转成内连接semi-join查询,物化就是会吧子查询看做一个表,如果数据太大,超过系统变量...前面说的子查询不能由having和group by等。...WHERE subquery_where) 可以转成 EXISTS (SELECT inner_expr FROM ......WHERE subquery_where AND outer_expr=inner_expr) 但当inner_expr和outer_expr值为null的情况下比较特殊,因为null值为操作符返回的是...WHERE TRUE; 上面说的是不相关子查询,若是相关子查询的话怎么办呢?
也就是说如果某列存在空值,即使对该列建索引也不会提高性能。...确定特定类型 varchar(字节数) 变长字符串 varchar内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535 5.0之后的mysql对其读写都会保留末尾空格...所以定义的时候应该注意顺序),或者显式指定:order by field(column_name, ('b', 'a', 'c')) 在建表后需要新增枚举种类只能alter table,所有不适合种类不确定的类型...在SELECT或WHERE列表中包含了子查询,该子查询被标记为SUBQUERY DEPEDENT SUBQUERY 依赖外部查询的子查询 DERIVD 在FROM列表中包含的子查询被标记为DERIVED...unique_subquery。
1.2为什么需要explain命令 我们很多时候编写完一条SQL语句,往往想知道这条SQL语句执行是否高效。...或者说,我们建立好的索引在这条SQL语句中是否使用到了,就可以使用explain命令来分析一下!...range:范围扫描,就是一个有限制的索引扫描,它开始于索引里的某一点,返回匹配这个值域的行。...ref:一种索引访问,也称索引查找,它返回所有匹配某个单个值的行。此类型通常出现在多表的 join 查询, 针对于非唯一或非主键索引, 或者是使用了最左前缀规则索引的查询。...当然了,在《高性能MySQL》中也有复杂的SQL语句来分析(但我认为我们一般不会写到那么复杂)..
一、慢查询日志 开启撒网模式 开启了MySQL慢查询日志之后,MySQL会自动将执行时间超过指定秒数的SQL统统记录下来,这对于搜罗线上慢SQL有很大的帮助。...(有时候不一定,我看到很多博客讲的是超过指定秒数,但我实验得出的结果是达到指定秒数) 二、EXPLAIN 点对点分析你 explain是一个神奇的命令,可以查看sql的具体的执行计划。...五、优化group by 语句 为什么order by后面不能跟group by ?...事实上,MySQL在所有的group by 后面隐式的加了order by ,也就是说group by语句的结果会默认进行排序。...八、改变执行计划 提高索引优先级 use index 可以让MySQL去参考指定的索引,但是无法强制MySQL去使用这个索引,当MySQL觉得这个索引效率太差,它宁愿去走全表扫描。。。
慢查询日志 开启撒网模式 开启了MySQL慢查询日志之后,MySQL会自动将执行时间超过指定秒数的SQL统统记录下来,这对于搜罗线上慢SQL有很大的帮助。...(有时候不一定,我看到很多博客讲的是超过指定秒数,但我实验得出的结果是达到指定秒数) EXPLAIN 点对点分析你 explain是一个神奇的命令,可以查看sql的具体的执行计划。...优化group by 语句 为什么order by后面不能跟group by ? ...事实上,MySQL在所有的group by 后面隐式的加了order by ,也就是说group by语句的结果会默认进行排序。 ...改变执行计划 提高索引优先级 use index 可以让MySQL去参考指定的索引,但是无法强制MySQL去使用这个索引,当MySQL觉得这个索引效率太差,它宁愿去走全表扫描。。。
unique_subquery:类似于eq_ref,条件用了in子查询 index_subquery:区别于unique_subquery,用于非唯一索引,可以返回重复值。...简单点说,这个字段表示存储引擎返回的数据在经过过滤后,剩下满足条件的记录数量的比例。...如下: 如果给数字加上'',也就是说,传的是一个字符串呢,当然是走索引,如下图: 为什么第一条语句未加单引号就不走索引了呢?...in元素一般建议不要超过200个,如果超过了,建议分组,每次200一组进行哈。...方向1:既然它默认会排序,我们不给它排是不是就行啦。 方向2:既然临时表是影响group by性能的X因素,我们是不是可以不用临时表? 我们一起来想下,执行group by语句为什么需要临时表呢?
---- 有这么一个 SQL,外查询 where 子句的 bizCustomerIncoming_id 字段,和子查询 where 字句的 cid 字段都有高效索引,为什么这个 SQL 执行的非常慢,需要全表扫描...为什么会有这些优化策略?...也就是说,优化器会将上面的 SQL 改写成这样: select * from t1 where exists(select b from t2 where id 返回一个值,在这种情况下,可以使用 semijoin 来优化子查询,提升查询效率。...如果子查询结果太大,超过 tmp_table_size 大小,会退化成磁盘临时表。这跟前面提到的“我们误以为的”过程相似,这样子查询只需要执行一次,而不是对于外层查询的每一行都得执行一遍。
定位慢业务问题 首先我们先来说这么慢业务问题,一般的慢业务问题,总归就那么几种,SQL 问题,代码业务问题,前端解析问题,前端的解析问题我们就不说了,为什么呢?...比如说,我们要初始化一个列表,预置12个月的数据给前端 List list = new ArrayList(); for(int i = 0 ; i 为什么呢?因为阿粉在之前的文章中已经详细的讲过了,大家如果有兴趣的话,可以翻看一下。...慢查询日志记录慢SQL 定位慢SQL可以通过慢查询日志来查看慢SQL,默认的情况下,MySQL数据库不开启慢查询日志(slow query log),需要手动把它打开 SET GLOBAL slow_query_log...:类似于eq_ref,条件用了in子查询 index_subquery:区别于unique_subquery,用于非唯一索引,可以返回重复值 range:常用于范围查询,比如:between … and
小编说:PostgreSQL作为一个优秀的数据库产品,其本身有着非常多值得学习和研究的地方。...从下图中的Call Stack我们可以看出planner与subquery_planner之间的调用关系。 ? 函数以查询树作为输入参数,并以优化后语句作为返回值。...完成对tuple_faction的设置后,进入后续优化流程,subquery_planner的函数原型如下所示。 ? 这里也许读者会迷惑,为什么是subquery_planner呢?...从名字上看该函数像是用来处理子查询,那么为什么用来作为整个查询语句优化的入口呢(Primary Entry Point)?...那么subquery_planner函数似乎也应该有相应于这些语句的优化处理。就这点而言,subquery_planner与原始语法树到查询树的转换所采取的处理方式相似。
2) Using where mysql 将在存储引擎检索行后再进行过滤,许多where条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带where子句的查询都会显示...当查询语句中有一些不确定的数据时,则不会被缓存。例如包含函数NOW()或者CURRENT_DATE()的查询不会缓存。...有一点需要注意,MySQL并不是会因为查询中包含一个不确定的函数而不检查查询缓存,因为检查查询缓存之前,MySQL不会解析查询语句,所以也无法知道语句中是否有不确定的函数。...优化器会根据优化规则对关系表达式进行转换,这里的转换是说一个关系表达式经过优化规则后会生成另外一个关系表达式,同时原有表达式也会保留,经过一系列转换后会生成多个执行计划,然后CBO会根据统计信息和代价模型...MySQL将结果集返回给客户端是一个增量、逐步返回的过程。在查询生成第一条结果时,MySQL就可以开始向客户端逐步返回结果集了。 上述为理论知识可能有点麻!
result', computea(2) ); // output: // result 4 // result 4 // result 4 无需在意上述函数的具体功能,你只需要知道对于相同的输入,它总是会返回相同的输出...而 computeb 是不确定的,因为它调用了另一个不确定的函数Math.random()。我们怎么知道 Math.random()是不确定的?因为这个函数会根据系统时间(外部状态)来计算随机值。...无论这个函数被调用多少次,无论是否并行调用该函数,也无论函数外部是什么状况,它必然会输出 4。 不确定的程序则恰好相反,在大多数情况下,add(2, 2)将返回 4。...但有时,该函数可能会返回 3、5,甚至 1004。程序中万万不能出现不确定性,我希望你明白为什么。 不确定的代码有什么后果?它们会引发软件缺陷,也就是常说的 bug。...但我相信在不久的将来,终有一天面向对象编程会退出这个舞台,就像如今的 COBOL 一样。
为什么有的情况下,减少连接数反而会提升吞吐量呢?为什么建议设置的连接池大 小要跟CPU的核数相关呢?每一个连接,服务端都需要创建一个线程去处理它。连接数越多,服务端创建的线程数就会越多。 ...问题:CPU是怎么同时执行远远超过它的核数大小的任务的?时间片。上下文切换。而CPU的核数是有限的,频繁的上下文切换会造成比较大的性能开销。...也就是说,对于主节点来说,写入 binlog,事务结束,就返回给客户端了。对于 slave 来说,接收到 binlog,就完事儿了,master 不关心 slave 的数据有没有写入成功。 ...master 不会等待很长的时间,但是 返回给客户端的时候,数据就即将写入成功了,因为它只剩最后一步了:就是读取 relay log,写入从库。 ...SUBQUERY 子查询中所有的内层查询都是 SUBQUERY 类型的。
也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。...单表索引不能过多,业界有个不成文的规定,单表字段不超过20个,索引不超过5个,因为随着数据量的增加,过多的索引会占据很多物理空间。...SUBQUERY:当 select 或 where 列表中包含了子查询,该子查询被标记为:SUBQUERY 。...unique_subquery:只是用来完全替换子查询的索引查找函数效率更高了。 index_subquery:区别于unique_subquery,用于非唯一索引,可以返回重复值。...简单点说,这个字段表示存储引擎返回的数据在经过过滤后,剩下满足条件的记录数量的比例。(MySQL.5.7后,默认explain直接显示partitions和filtered的信息)。
WHERE expression [NOT] IN (subquery) 通过未修改的比较运算符引入且必须返回单个值。...如果外部查询的 WHERE 子句包括列名称,它必须与子查询选择列表中的列是联接兼容的。 ntext、text 和 image 数据类型不能用在子查询的选择列表中。...将返回右表的所有行。如果右表的某一行在左表中没有匹配行,则将为左表返回空值。 FULL JOIN 或 FULL OUTER JOIN 完整外部联接将返回左表和右表中的所有行。...EXCEPT 运算符返回由 EXCEPT 运算符左侧的查询返回、而又不包含在右侧查询所返回的值中的所有非重复值。...在不需要常规使用视图时替换视图,也就是说,不必将定义存储在元数据中。 启用按从标量嵌套 select 语句派生的列进行分组,或者按不确定性函数或有外部访问的函数进行分组。
注意:id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行。...:用于where中的in形式子查询,子查询返回不重复值唯一值 I:index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重。...以上说的是索引扫描的两种情况,一种是查询使用了覆盖索引,那么它只需要扫描索引就可以获得数据,这个效率要比全表扫描要快,因为索引通常比数据表小,而且还能避免二次查询。...大概的意思就是说,如果你想要优化你的查询,那就要注意extra辅助信息中的using filesort和using temporary,这两项非常消耗性能,需要注意。...查询条件中分为限制条件和检查条件,5.6之前,存储引擎只能根据限制条件扫描数据并返回,然后server层根据检查条件进行过滤再返回真正符合查询的数据。
大纲 scalar-expression comparison-operator SOME (subquery) 参数 scalar-expression - 将其值与子查询生成的结果集进行比较的标量表达式...subquery - 一个用括号括起来的子查询,它返回一个用于与标量表达式比较的结果集。...示例 下面的例子选择了居住在密西西比河以西任何一个州的工资超过75,000美元的员工: SELECT Name,Salary,Home_State FROM Sample.Employee WHERE
id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行。 2. select_type 3. table 查询的表名。...相对于下面的ref区别就是它使用的唯一索引,即主键或唯一索引,而ref使用的是非唯一索引或者普通索引。 eq_ref只能找到一行,而ref能找到多行。...若联接只用到索引的最左前缀或索引不是主键或唯一索引时, 使用ref类型(也就是说,此联接能够匹配多行记录)。ref可用于使用’=‘或’'操作符作比较的索引列。...用于where中的in形式子查询,子查询返回不重复值唯一值,可以完全替换子查询,效率更高。...适用于非唯一索引,可以返回重复值。
大纲 scalar-expression comparison-operator ANY (subquery) 参数 scalar-expression - 将其值与子查询生成的结果集进行比较的标量表达式...subquery - 一个用括号括起来的子查询,它返回一个用于与标量表达式比较的结果集。...示例 下面的例子选择了居住在密西西比河以西任何一个州的工资超过75,000美元的员工: SELECT Name,Salary,Home_State FROM Sample.Employee WHERE
EXPLAIN为SELECT语句中使用的每个表返回一行信息,它按照MySQL在处理语句时读取表的顺序列出输出中的表。...有子查询的语句id可能相同也可能不同 为什么有可能相同也有可能不同的,那是因为查询优化器觉得这条包含子查询的语句可以使用连接查询进行优化, 就会对这条语句进行重写为连接查询,所以想知道查询优化器是否重写了查询语句...SELECT * FROM `user` union SELECT * FROM user1; EXPLAIN 结果: 可以看到,user表和user1表之间用union 连接,结果却有三条记录,这是为什么呢...上面我们说过id也会为空,就是在使用union进行查询的时候。...本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能 会找到多个符合条件的行,所以它属于查找和扫描的混合体。 fulltext:使用了全文索引进行查询。
一打开科技类论坛,最常看到的文章主题就是MySQL性能优化了,为什么要优化呢?...因为: 数据库出现瓶颈,系统的吞吐量出现访问速度慢 随着应用程序的运行,数据库的中的数据会越来越多,处理时间变长 数据读写速度缓慢 就是咱们说的“性能问题”,程序员一遇到它总是焦头烂额!...,而在 5.5 里为DEPENDENT SUBQUERY。...传统分页 select * from table limit 10000,10 2)limit原理 Limit 10000,10 偏移量越大则越慢 3)推荐分页 # 复杂关联SQL的优化 1、首先查询返回的结果集...,通常查询返回的结果集很少,是有优化的空间的。