优化器的作用:

我们知道,一条SQL语句,可以有很多执行方式,最后都返回相同的结果,而优化器的作用就是找到最好的执行计划。

一、RBO-基于规则的优化器(rule)

系统内置的一套硬编码规则,根据规则生成执行计划,无论表数据发生怎样的变化,也不会影响执行计划,也就是是RBO对数据不敏感;比如在规则中,索引的优先级大于全表扫描

二、CBO-基于成本的优化器(cost)

CBO优化器根据SQL语句生成一组可能被使用的执行计划,估算出每个执行计划的代价,选择一个代价最小的执行计划。

三、Mysql的查询优化器

Mysql采用的是CBO-基于成本的优化器,它会尝试估算一个查询所有可能的执行计划的成本,并选择其中成本最小的一个执行计划。成本的最小单位是随机读取一个4K的数据页的成本;可以通过查询当前会话的Last_query_cost的值获取Mysql计算的当前查询的成本。如下:

EXPLAIN SELECT * FROM `user` WHERE username='xxxx';

SHOW STATUS LIKE 'Last_query_cost';

1、 常用的优化类型

(1)、重新定义关联表的顺序

数据表的关联并不总是按照在查询中指定的顺序执行。决定关联的顺序是优化器很重要的一部分功能。

(2)、将外连接转为内连接

并不是所有的outer join 语句都必须以外连接的方式执行。例如where条件、库表结构都可能会让外连接等价一个内连接。MySQL能够识别这点并重写查询,让其可以调整关联顺序。

(3)、使用等价变化规则;可以合并和减少一些比较,还可以移除一些恒成立和恒不成立的判断

MySQL可以使用一些等价变换来简化并规范表达式。它可以合并和减少一些比较,还可以移除一些恒成立和一些恒不成立的判断例如(8=8 and a>8)将被改写成 a>8。

(4)、优化count()、min()和max()

count(*)、count(1)由于统计没有明确的字段,所以查询以行数为准,不会判断某一列中的null值;

count(uid)则会判断uid列中的null值,并把null值排除。

对max、min统计频繁或数据量大的字段尽量添加索引,可以大大提高查询统计的效率。

(5)、预估并转化为常数表达式;当MySQL检测到一个表达式可以转化为常数时,就会一直把该表达式作为常数进行优化处理

(6)、覆盖索引扫描;当扫描的索引列包含所有查询中需要的使用的列时,MySQL就可以直接使用索引返回需要的数据。(explain分析extra值为use index)

2、关联查询排序优化

关联查询时使用排序,两种情况:

(1)、order by子句的所有排序列都来自关联的第一张表,mysql在关联处理第一个表时就会进行文件排序。

(2)、除上述(1)中情况之外,mysql都会将关联的结果存放在一个临时表中,在所有关联都结束之后,再进行文件排序。这点可以通过explain分析查询语句查看extra里面的内容验证。

(*)如果排序查询中有LIMIT的话,LIMIT也会在排序之后应用,所以即使需要返回较少的数据,临时表和需要排序的数据量仍然会非常大。

3、查询优化器提示

(1)DELAYED

对于 INSERT 和 REPLACE 有效。

mysql 会将提示语句立即返回给客户端, 并将插入的行数据放入到缓冲区, 然后在表空闲的时候批量将数据写入。Innodb不支持。

(2)STRAIGHT_JOIN

在数据量大的联表查询中灵活运用的话,直接影响关联顺序, 减少statistics(统计)的时间, 能大大缩短查询时间。 STRAIGHT_JOIN功能同join类似,但能让左边的表来驱动右边的表,能改表优化器对于联表查询的执行顺序。

(3)USE INDEX 、 IGNORE INDEX 、 FORCE INDEX

提示优化器使用不使用索引,USE INDEX 、 FORCE INDEX 使用基本一致,FORCE INDEX 更加强调全表扫描,代价更大。

4、什么时候该创建索引,实在无法决定,教你一招

索引选择性 = 基数/总行数

比如:有一张user表,对表中nickname字段计算索引选择性:

SELECT COUNT(DISTINCT(nickname))/COUNT(id) AS selectivity FROM user;

计算出selectivity的值就是选择性,最大为1,值越大,选择性越高,所以有时候索引的建立不仅跟表结构有关,还跟数据量结构和数据量有关。

好了,今天的分享就到这里,如果喜欢我的内容,欢迎收藏、转发~~

谢谢!下期见。。。

mysql 关联查询_Mysql查询优化器,再也不会因为该什么时候建立索引发愁了相关推荐

  1. mysql 优化器关联查询_MySQL 查询优化器(二)

    1.6多个查询字段(常量条件) 多个查询字段的查询处理逻辑如下所示: JOIN:prepare阶段 setup_tables():同1.1测试. setup_fields():同1.1测试. setu ...

  2. mysql 关联查询_mysql数据库调优(二)

    第五.查询优化 1.查询慢的原因:网络因素.CPU.IO.上下文切换.系统调用.生成统计信息.锁等待时间等 2.优化数据库访问:查询性能地下的原因是访问的数据太多,某些查询不可避免的需要筛选大量的数据 ...

  3. mysql useing查询_MySQL查询优化一例——也说说 Using intersect

    生产上面有一条sql查询很慢,需要7到8秒左右,简化之后的sql如下所示: SELECT mingxi.* FROM ( SELECT btjc01.id, department.`name` AS ...

  4. Mysql 关联查询的优化 及 子查询优化

    Mysql 关联查询的优化 left join ①EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card = book.card; ②如何优化 ...

  5. mysql关联查询操作表最新数据

    mysql关联查询操作表最新数据 mysql关联查询操作表最新数据的几种方式(max,order by)和性能分析,再数据量较多,关联ID存在索引的情况下建议使用方式二,速度更快.具体请看SQL及EX ...

  6. MySQL优化器_MySQL查询优化器

    MySQL优化器 MySQL架构图 讲到MySQL,就绕不开他的架构图.MySQL是一个经典的C/S架构.服务器这边分两层:第一层是Server层,第二层是存储引擎.Server层处理主要的业务操作流 ...

  7. mysql 优化器代码_Mysql查询优化器

    Mysql查询优化器 本文的目的主要是通过告诉大家,查询优化器为我们做了那些工作,我们怎么做,才能使查询优化器对我们的sql进行优化,以及启示我们sql语句怎么写,才能更有效率.那么到底mysql到底 ...

  8. mysql 关联查询_响应时间长?MySQL查询优化教程来了!

    - 点击上方"爱数据学习社"关注我们吧! - 为什么查询会慢?--响应时间过长. 如果把查询看做是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询, ...

  9. mysql优化器分析器_MySQL查询优化器的概念和原理整个执行过程

    原标题:MySQL查询优化器的概念和原理整个执行过程 什么是MySQL的Query Optimizer 专门负责优化SELECT语句的优化器模块MySQL Query Optimizer通过计算分析收 ...

最新文章

  1. 【VS+QT开发】找不到到qhostinfo.h文件
  2. JQuery-Dialog(弹出窗口,遮蔽窗口)
  3. 用于科研的移动机器人平台推荐
  4. java中isolate时间_Java HikariDataSource.setIdleTimeout方法代码示例
  5. 大数据学习笔记23:MR案例——采用Combiner做词频统计
  6. 基于 HTML5 WebGL 的 3D 场景中的灯光效果
  7. 阿里P8好友说,要想成为Java大佬,就得要多逛逛国外的这几个技术网站...
  8. nodejs下载文件
  9. PS如何进行自定义画笔
  10. AspNetPager组件
  11. 色彩的搭配,象征,以及web标准色
  12. Transformer 真的很全能!谷歌用协同训练策略实现多个SOTA,单一ViT模型执行多模态多任务...
  13. Android开发之手机震动器
  14. ASP.NET 5 Target framework dnx451 and dnxcore50
  15. TCP的TIME_WAIT状态为什么要等待2MSL的时长
  16. 个人java后端详细学习路线(0→1)
  17. c语言-选手评分系统
  18. 知之者不如好之者 好之者不如乐之者
  19. 人脸识别选这几家就对了!
  20. 偶然发现的一篇文章 激励自己吧。

热门文章

  1. 12个便于web设计及开发的在线工具
  2. 精心挑选的23款美轮美奂的 jQuery 图片特效插件
  3. 04,认证、权限、频率
  4. Python3.6全栈开发实例[005]
  5. linux常用命令大全(转)好东西要分享
  6. 常用的好用的window工具
  7. 数据库抽象类PDOStatement对象使用
  8. nios pio interrupt 的使能
  9. php 数组对比 unset,如何区分PHP中unset,array_splice的区别
  10. android项目编码规范,Android 项目规范