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…

python中减法运算函数_详解 Python 的二元算术运算,为什么说减法只是语法糖?...

原题| Unravelling binary arithmetic operations in Python作者| Brett Cannon译者| 豌豆花下猫(“Python猫”公众号作者)声明| 本翻译是出于交流学习的目的,基于 CC BY-NC-SA 4.0 授权协议。为便于阅读,内容略有改动。大家对我解读属性访问的博客文章反…

【SQL】DQL语句影响行数不能超过XX值

mysql执行临时查看添加limit 10 查询 select * from msg_info cc WHERE DATE_FORMAT(cc.CREATE_DATE,%Y%m%d) 20231127;> 1025 - [xx_dql_where]DQL语句需要增加where条件;[xx_dql_explain]DQL语句影响行数不能超过20000,当前值180906; > 时间: 0.021s处理 select * …

Oracle访问同义词连接超时,利用同义词解决oracle用户访问其它schema的对象

由于应用需要,aa能访问bb的所有表。SQL> create user aa identified by oracle;User created.SQL> grant connect,resource to aa;Grant succeeded.SQL> create user bb identified by oracle;User created.SQL> grant connect,resource to bb;Grant su…

一个不错的讲解flex 3中自定义事件的文章

一个不错的讲解flex 3中自定义事件的文章 http://wangyisong.javaeye.com/blog/376118,一个不错的讲解flex 3中自定义事件的文章posted on 2009-08-08 17:41 jackyrong的世界 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/jackyrong/archive/2009…

oracle同义,oracle同义词

搞了几天数据同步的程序,写完之后觉得很浪费,因为oracle自身的数据库联机备份功能已经相当强大。不过关键一点是我们应用场景跟联机备份有很大差别。虽然这次没用上oracle自身备份功能,但是有一个通过建立db link 来实现同步倒也很简单&#…

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

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

调用WindowsAPI显示帮助提示

导言 前一段时间,在编写程序的过程中,需要一个帮助功能按钮。这个按钮众所周知,按下按钮以后,鼠标变成带有问号的鼠标,然后点击画面上的控件,然后就回出现一个提示的文本,该处是什么含意。就好像…

python整形魔法_python 魔法方法

1、什么是魔法方法?魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自…

oracle正则匹配全部,sql – 返回Oracle中正则表达式的所有匹配项

您已经提供了数据样本,说明这是一行,但已将其显示为两个不同的行.所以这个例子基于你的话.-- Sample of data from your question extra row for the sake of demonstration-- id column is added to distinguish the rows(I assume you have one)with t1(id, col) as(select …

hashtable,dictionary 从原理上说说有什么异同,哪个性能高一些

hashtable里存的对象全部是object类型 ,所有对象存进去都被转成object类型,读取出来每次都需要转换类型,hashtable对存入的类型没有限制 , 因此在读取转换类型时容易出错, dictionary只能存入定义时指定的类型,而且不像hashtable会把类型转换成object,存取起来比前者方便,效率更…

riak php7,Laravel中服务提供者的register和boot分别是干什么

register方法正如前面所提到的,在register方法中只绑定事物到服务容器,而不要做其他事情,否则,一不小心就能用到一个尚未被加载的服务提供者提供的服务。现在让我们来看看一个基本的服务提供者长什么样:namespace AppP…

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

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

批处理文件入门

后缀是bat的文件就是批处理文件,是一种文本文件。简单的说,它的作用就是自动的连续执行多条命令,批处理文件的内容就是一条一条的命令。那它有什么用呢? 比如,在启动wps软件时,每次都必须执行 C:\>cd wp…

python批量生成图片_利用Python批量生成任意尺寸的图片

实现效果通过源图片,在当前工作目录的/img目录下生成1000张,分别从1*1到1000*1000像素的图片。效果如下:目录结构实现示例# -*- coding: utf-8 -*-import threadingfrom PIL import Imageimage_size range(1, 1001)def start():for size in …

sql server linkserver oracle,SQL Server中使用Linkserver连接Oracle的方法

1.安装Oracle Client连接到Oracle的前提是在SQL Server服务器上安装Oracle Client。Oracle Client下载地址如下:安装完毕后要修改对应的tnsnames文件才能连接对应的数据,该文件所在目录:Oracle安装路径\product\10.2.0\client_1\NETWORK\ADMI…

SQL Server日期格式转换大全

Sql Server 中一个非常强大的日期格式化函数 Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06 Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16 Select CONVERT(varchar(100), GETDATE(), 3): 1…

oracle传date参数十二小时,Oracle数据库中 to_date()与24小时制表示法及mm分钟的显示...

一、在使用Oracle的to_date函数来做日期转换时,时候也许会直接的采用“yyyy-MM-dd HH:mm:ss”的格式作为格式进行转换,但是在Oracle中会引起错误:“ORA 01810 格式代码出现两次”。to_date(2005-01-01 13:14:20,yyyy-MM-dd HH24:mm:ss)原因是…

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

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