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

a5f86d6ad2dc20927b02a9e8177b3d56.png

优化器的作用:

我们知道,一条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,值越大,选择性越高,所以有时候索引的建立不仅跟表结构有关,还跟数据量结构和数据量有关。

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

谢谢!下期见。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

购物车的收货地址js php,Javascript实现购物车功能的详细代码

我们肯定都很熟悉商品购物车这一功能,每当我们在某宝某东上购买商品的时候,看中了哪件商品,就会加入购物车中,最后结算。购物车这一功能,方便消费者对商品进行管理,可以添加商品,删除商品&#…

CLI下的网页浏览器之二——Lynx

出自:http://vb2005xu.javaeye.com/blog/230044 Lynx浏览器使用指南 Lynx是一个字符界面下的全功能的WWW浏览器。Lynx 可以运行在很多种操作系统下,如VMS, UNIX, Windows 95, Windows NT等,当然也包括Linux。 由于没有漂亮的图形界面&#xf…

stm32 整数加法循环时间_【教学设计】小数加法教学设计

小数加法教学设计刘秀锦舞钢市特殊教育学校教材分析本节课是第四单元“小数加减法”的第一课时,小数加减法是以整数加减法为基础进行教学的,本节课走踏实了,后边的知识才能顺利的进行下去,所以本节课还是以小步走、学一点、练一点…

天锐绿盾解密_天锐绿盾数据防泄密系统

天锐绿盾数据防泄密系统(简称数据防泄密系统)是一套从源头上保障数据安全和使用安全的软件系统。包含了文件透明加解密、内部文件流转、密级管控、离线管理、文件外发管理、灵活的审批流程、工作模式切换、服务器白名单等功能,并全面覆盖Mac、…

矩阵维度必须一致_如何从看得懂到会使用矩阵思维

本来我一开始是想学习如何使用艾森豪威尔矩阵的,但是利用学习观的方法想去网上找有关艾森豪威尔矩阵的例子时,发现网上几乎没有,网上能搜出来的都是对这个矩阵的介绍,看完这些介绍你会发现很简单,都能看懂,…

numpy 归一化_归一化(MinMax)和标准化(Standard)的区别

此文参考https://blog.csdn.net/u010947534/article/details/86632819定义上的区别归一化:将数据的值压缩到0到1之间,公式如下标准化:将数据所防伪均值是0,方差为1的状态,公式如下:归一化、标准化的好处&am…

python多态_Python基础入门18节-第十六节 面向对象如何理解多态

多态是面向对象的一大特性,Python本身也是一门多态性的语言。在Python中要实现多态,还是得借助于上节提到的继承。假设有这么一个场景,在夏季我们可以看到荷花、牡丹花、太阳花,夏天一到这些花全都开放了。这些花我们就将它理解多…

linux重启后root密码错误,Linux技巧| 解决Debian Root密码忘记的问题

Debian Root密码忘记开机 grub 菜单下进入单用户模式进行修改密码/修改系统文件。解决过程注:本教程适用于 Debian 7 8 91. 首先。重启一下系统。在开机 grub 内核选择菜单那里,迅速按“e”。2. 将光标移动到“linux”开头的那一行,将原来的“…

SilverLight学习笔记--Silverlight中WebService通讯

本文我们学习如何在Silverlight中使用WebService进行通讯。 新建项目Silverlight应用程序,命名为:SLWebService。在服务器端我们需要做两项目工作: 1、在Web项目中新建一个类Person,我们将在WebService中返回它的实例化对象。Person类定义如下…

导出文件_一招解决PDF文件导出图片

将PDF文件保存为高清图片是经常需要进行的保存方式之一,因为PDF文件虽然安全性高,但是相比较图片而言,还是不易进行查看的,那么如何将PDF文件导出图片呢?以前也了解过很多方法,不过最好的当然不是截图了。虽…

linux缓存文件用户权限错误,CVE-2019-11244漏洞到底该如何修复?--关于缓存文件权限设置...

2019年5月,Kubernetes社区(后面简称”社区“)修复了标号为CVE-2019-11244的安全漏洞,这个修复方案似乎并不彻底,于是有人发布Issue对此提出异议,希望提供进一步修复方案。虽然Kubernetes已经非常安全,但对于一些安全标…

高中数学40分怎么办_2019年第35届全国高中数学联赛试题及参考答案

2019年第35届全国高中数学联赛考试已结束,本文收集整理本次数学联赛的试题和参考答案,以供大家了解参考。本次数学联赛由全国高中数学联赛组委会统一命题,共分为一试和二试。一试时间为80分钟,包括8道填空题(每题8分)和3道解答题(…

一个把图片保存到SQL数据库的工具

因公司的业务需要,会把很多图片保存到数据库中.因此做了一个很简单的工具,把图片保存到SQL数据库中.1.可以连接到不同服务器上的SQL数据库,可以选择操作各个表;2.可以指定保存到数据库的图片格式(JPG or BMP);3.可以用windows图片和传真查看器预览图片.下载地址:一个把图片保存…

redis 哨兵_Redis哨兵机制的原理介绍

php中文网最新课程每日17点准时技术干货分享本篇文章给大家带来的内容是介绍Redis的哨兵机制,让大家了解哨兵机制的原理和如何实现。有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。概述Redis的复制有一个缺点,当主…

BoooLee pyretoolkit -- 一个基于python re模块的在线正则表达式测试工具

为了学习python re模块正则表达式,寻找了一些正则表达式工具,除了komodo捆绑的rx toolkit外,其他的测试工具都是基于.net或其他引擎的,语法上多少有点出入。 干错自己写一个,用了2天时间,python re googl…

【大数据】NiFi 的基本使用

NiFi 的基本使用 1.NiFi 的安装与使用1.1 NiFi 的安装1.2 各目录及主要文件 2.NiFi 的页面使用2.1 主页面介绍2.2 面板介绍 3.NiFi 的工作方式3.1 基本方式3.2 选择处理器3.3 组件状态3.4 组件的配置3.4.1 SETTINGS(通用配置)3.4.2 SCHEDULING&#xff0…

linux 如何打包分区文件,Linux基础------文件打包解包---tar命令,文件压缩解压---命令gzip,vim编辑器创建和编辑正文件,磁盘分区/格式化,软/硬链接...

作业一:1)将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖)cat /etc/passwd /etc/group > /1.txt2)将用户信息数据库文件和用户密码数据库文件纵向合并为一个文件/2.txt(追加)cat /etc/passwd /etc/shadow >> /2.txt3)将/1.txt、/2.…

sqlserver大数据表操作慢_架构师必看!操作日志系统搭建秘技

​在Java开发中,我们经常会遇到一个棘手的问题:记录用户的操作行为。某些操作是相对简单的,我们可以逐条记录。但是某些操作行为却很难记录,例如编辑操作。在某一次操作中,用户可能编辑了对象A的几个属性,而…

sql共享功能目录无法更改_大企业数据库服务首选!AliSQL这几大企业级功能你不可不知...

MySQL代表了开源数据库的快速发展,从2004年前后的Wiki、WordPress等轻量级Web 2.0应用起步,到2010年阿里巴巴在电商及支付场景大规模使用MySQL数据库,再到2012年开始阿里云RDS for MySQL为成千上万家客户提供可靠的关系数据库服务&#xff0c…

递归下降语法分析器的构建_一文了解函数式查询优化器Spark SQL Catalyst

大数据技术与架构点击右侧关注,大数据开发领域最强公众号!暴走大数据点击右侧关注,暴走大数据!记录一下个人对sparkSql的catalyst这个函数式的可扩展的查询优化器的理解,目录如下:0. Overview1. Catalyst工…