8.2.1.2 How MySQL Optimizes WHERE Clauses MySQL 优化WHERE 子句
8.2.1.2 How MySQL Optimizes WHERE Clauses MySQL 优化WHERE 子句 本节讨论优化用于处理WHERE子句, 例子是使用SELECT 语句,但是相同的优化应用于WHERE子句在DELETE和UPDATE子句 注意: 因为MYSQL优化是不间断的,不是所有的MYSQL 优化都记录在这里 你可能尝试重写你的查询让运算操作更快,同时牺牲可读。 因为MySQL 做类似的优化自动的,你可以避免这类工作,让查询在一个更加容易懂的和维护的形式。 MYSQL遵循一些优化: 去除不必要的圆括号: ((a AND b) AND c OR (((a AND b) AND (c AND d))))
-> (a AND b AND c) OR (a AND b AND c AND d) Constant folding:
(a<b AND b=c) AND a=5
-> b>5 AND b=c AND a=5 恒定条件去除(需要的,因为不断折叠) (B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
-> B=5 OR B=6 索引使用的常量表达式只被评估一次 COUNT(*) 在一个简单的表没有一个WHERE 是直接检索从表信息对于MyISAM and MEMORY tables. 这个也用于对于任何NOT NULL 表达式当只用于一个表 早期检测到的无效的常量表达式,MySQL 快速的检测一些查询语句是不可能的没有记录返回 HAVING 是合并WHERE 如果你不使用GROUP BY 或者聚合函数count(),min() 对于每个表在一个关联, 一个简单的WHERE 是被构建来得到一个快速的WHERE 评估对于表 也尽快的跳过记录 所有的常量表是首先读取 在任何其他表之前在查询里,一个常量表是下面的任何一个: 1.一个空表或者一个表只有一条记录 2.一个表 用于WHERE 子句在一个主键或者一个唯一键, 所有的index部分是和常量表达式比较,定义为NOT NULL 下面所有的表是用于作为常量表: SELECT * FROM t WHERE primary_key=1; SELECT * FROM t1,t2
WHERE t1.primary_key=1 AND t2.primary_key=t1.id; 最好的关联组合用于表关联是通过尝试所有的可能找到的, 如果所有的列在ORDER BY 和GROUP BY 子句来自同一个表, 那个表是首选的当关联时 如果有一个ORDER BY 子句和一个不同的GROUP BY 子句,或者如果ORDER BY 或者GROUP BY 包含列来自多个表在关联, 会创建一个临时表 如果你使用SQL_SMALL_RESULT选项,MySQL 使用一个内存临时表 每个表索引是查询的, 最好的索引是被使用除非优化器相信 使用表扫描更加有效。 一次扫描被使用基于是否最好的索引跨越了多余30%的表数据, 但是一个固定的百分比不会决定选择在使用索引和表扫描。 优化现在是更加复杂的基于它的评估额外的因素比如表大小,行的记录数,I/O块大小 有些情况下, MySQL 可以读取记录从索引而不需要访问表数据文件。 如果所有的列被使用从索引是数值的,只有索引树被使用来解决查询 在每行输出之前, 那些不匹配HAVING 子句的会被跳过
8.2.1.2 How MySQL Optimizes WHERE Clauses MySQL 优化WHERE 子句的更多相关文章
- mysql交互协议解析——mysql包基础数据、mysql包基本格式
mysql交互协议是开发mysql周边组件常用的协议,如JDBC,libmysql等等. 在此我们要认识到mysql交互协议其实是半双工的交互协议,至于为什么,这里就先挖个小坑,以后再填. 在探讨my ...
- [MySQL Reference Manual] 24 MySQL sys框架
24 MySQL sys框架 24 MySQL sys框架 24.1 sys框架的前提条件 24.2 使用sys框架 24.3 sys框架进度报告 24.4 sys框架的对象 24.4.1所有sys下 ...
- MySQL有关Group By的优化
昨天我写了有关MySQL的loose index scan的相关博文(http://www.cnblogs.com/wingsless/p/5037625.html),后来我发现上次提到的那个优化方法 ...
- MySQL命令大全:MySQL常用命令手册、MySQL命令行大全、查询工具
1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...
- Mac OS 下 mysql 找不到 mysql.sock 的问题
mysql.sock 无法找到一般存在两种问题,一是mysql服务未启动,mysql.sock没有生成,二是mysql.sock的指向位置出错,在指向位置加个mysql.sock的软链接就可以解决. ...
- mysql命令行以及mysql workbence查询结果中文乱码的解决方法
最近正在学习mysql,安装环境是windows server 2003 32位操作系统+mysql 5.1.47同时也安装了mysql命令行以及mysql workbench这里是test数据库cr ...
- [MySQL] SqlServer 迁移到 MySQL 方法介绍
一.原则: 只迁移表结构和数据,存储过程.函数.触发器尽量自己改写,并充分测试. 迁移前,先设置好数据库的一些参数,比如默认存储引擎,默认编码等,方便后续导入. 二.方法: 1.使用MySQL Wor ...
- MySQL安装之后没有MySQL数据库的原因
mysql安装完之后,登陆后发现只有两个数据库:mysql> show databases;+--------------------+| Database |+------ ...
- 《高可用MySQL》2 – 单机版MySQL主从配置
这里搭建的主从是最简单的单一主从复制(即一个Master和一个slave,没有任何的热机备份和多slave),该主从结构的基本拓扑图如下所示: 建立基本的主从复制可以总结为以下三个基本步骤: 配置ma ...
随机推荐
- Object -C NSSet -- 笔记
// // main.m // NSSET // // Created by facial on 25/8/15. // Copyright (c) 2015 facial_huo. All ...
- CF380C Sereja and Brackets [想法+线段树]
题意: 给出一串括号 给出一些询问,问某个区间[l,r]内的能合法匹配的括号数有多少个 分析: 我们能够实现处理两个数组 sum[i] 1....i中已经能匹配的右括号的数目 left[i] 1... ...
- 如何在Ubuntu 12.04 Server 中安装图形用户界面
root@ubuntu:~# gedit /etc/environment root@ubuntu:~# gedit /etc/profile ---------------------------- ...
- 多表关联查询(ORACLE版)
前言:这几天学习oracle,把自己对于关联查询的理解,记录下.如有错误请指正! 交叉连接: 交欢连接又称为“笛卡儿积连接”,是两个或多个表之间的无条件连接.一个表中所有的记录与其它表的所有的记录进行 ...
- [转] Java内部类之闭包(closure)与回调(callback)
闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为它 不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥 ...
- HDU 3572 最大流
[题意]有n个任务,每个任务必须开始于第Si天之后(包括Si),结束于第Ei天之前(包括Ei),每个任务持续的时间为Pi,现在有m台机器,每台每天只能专注做其中一件任务,每个任务做的时间可以不连续.问 ...
- .net 实现 URL重写,伪静态
一,获得Mircosoft URLRewriter.dll: 获得Mircosoft URLRewriter.dll可以到http://www.microsoft.com/china/msdn/lib ...
- Mysql数据数据[字节、长度、数据范围]一览表
1.mysql有哪些数据类型: 主要包括以下五大类: 整数类型:BIT.BOOL.TINY INT.SMALL INT.MEDIUM INT. INT. BIG INT 浮点数类型:FLOAT.DOU ...
- Ubuntu11.10与r8168网卡不兼容导致网络时断时续的问题
安装了ubuntu11.10之后,感觉上网啥的很不稳定,ssh连接内网机器也是一条命令卡半天,检查了各方面的原因,网络没有什么问题,最后才发现是网卡驱动的问题,网上搜了一下是由于linux(ubunt ...
- php魔法常量
有七个魔术常量它们的值随着它们在代码中的位置改变而改变.例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定.这些特殊的常量不区分大小写,如下: 名称 说明 __LINE__ 文件中的当前行号 ...