MySQL 优化器可选开关详解

标签: mysql 优化 开关 | 发表时间:2014-03-14 00:17 | 作者:yueliangdao0608
出处:http://blog.csdn.net
MySQL 从5.1开始,提供了关于优化器选项的开关选项。 这样,我们可以强制在优化器糊涂的时候,关闭一些我们认为不该做的事情;或者是当我们想查看优化器为什么要这么选择的时候,可以手动关闭或者打开这些选项来进行优化策略的改变。
MySQL 从5.5 和 5.6 开始,增加了更多的开关选项。 以便使查询更加优化。 下面我来一个一个解释下这些优化开关的含义以及用途。


MySQL 5.1 增加以下开关:
index_merge 
1). index_merge_intersection
如果有两个单独的索引都可用,但是其中任何一个都不是最优化的,那么优化器选择合并两个索引并且在他俩的结果集中做一个交集,然后根据这个交集对磁盘数据进行匹配。
2). index_merge_union
用于OR,把所有相关索引连接起来,找到记录对应的ROWID,然后根据ROWID获取磁盘上的数据。
3). index_merge_sort_union
用于OR,把所有相关索引连接起来,找到记录对应的ROWID,并且好顺序,然后根据ROWID获取磁盘上的数据。


MySQL 5.5 新增以下开关:
engine_condition_pushdown 
只用于NDB引擎。
不开启: 所有数据节点的数据都发送到SQL节点来处理。
开启后: 按照WHERE条件过滤后的数据发送到SQL节点来处理。


MySQL 5.6 增加以下开关:
1. mrr
   mrr_cost_based

       这个是从MySQL 5.6 开始增加的开关。  意思是针对普通索引把资源利用最大化,主要是针对多列索引,也叫组合索引来做基本扫描,然后对匹配的记录按照主键排序,这样按照有序的主键顺序从磁盘上扫描需要的全部记录。 根本功能是把对磁盘的随机扫描转化为顺序扫描。
主要针对的是数据太大,放不到CACHE里面(比如INNODB,或者MYISAM)。  目前对全索引扫描意义不大。
2. batched_key_access
(在JOIN BUFFER POOL里)当内表被扫描后,针对扫描到的记录,找到对应的主键值并且一次性交给MRR接口。省掉了频繁跟磁盘交互的IO部分。
3. block_nested_loop
(在JOIN BUFFER POOL里)当内表被扫描后,针对原来的记录加上一个是否匹配标记,生成新的记录。这样下次外表的值如果再来遍历内表,就只扫描不匹配的即可。省掉部分CPU资源。
4. index_condition_pushdown
不开启: 对于组合索引(A,B)来说,如果A可以用到索引,B不能用到,那么只能在索引树上找到A,然后再用A对应的指针到磁盘上遍历数据。
开启后: 同样对于组合索引(A,B)来说,如果A可以用到索引,B不能用到,那么在索引树上找到A,然后再通过B的过滤条件在索引树上进行过滤,删选后的指针到磁盘上遍历数据。
但是ICP并不能把随机扫描变为顺序扫描,只是减少了对磁盘交互的IO部分。
5. use_index_extensions
主要用于INNODB的第二索引,也就是普通的索引,把索引中包含的主键值利用到。比如主键为(a,b),索引为(c). 如果用到了索引c,那么把索引变成(c,a,b) 这样,就可以用到新的组合索引了。
不过这种场合用的也比较少,一般是根据组合主键中的第一个字段和普通索引一起来做检索的时候。


6. semijoin
表示在连接的时候内表去重的过程 。
比如对以下的查询,a.class_id 就只需要扫描一次和b.id相同的记录就可以不在继续了。因为不需要关心b表里面是否有多少相同的class_id,只需要知道有还是没有就行了。
所以一般用在对子查询的优化居多。

	mysql> select b.class_name from class as b, student as a where a.class_id = b.id;                                                            
	+------------+
	| class_name |
	+------------+
	| xinxi      |
	| xinxi      |
	+------------+
	2 rows in set (0.00 sec)


7. firstmatch
只选用内表的第一条与外表匹配的记录。
8. loosescan
把内表的数据基于索引分组,取每组第一条数据即可。
9. materialization
    subquery_materialization_cost_based

把内表去重然后生成有对应索引的临时表(有点类似其他数据中的物化视图),然后通过外表的对应键值遍历这张临时表。
主要针对不能抓华为半连接的检索类型。
作者:yueliangdao0608 发表于2014-3-13 16:17:09 原文链接
阅读:0 评论:0 查看评论

相关 [mysql 优化 开关] 推荐:

MySQL 优化器可选开关详解

- - CSDN博客推荐文章
MySQL 从5.1开始,提供了关于优化器选项的开关选项. 这样,我们可以强制在优化器糊涂的时候,关闭一些我们认为不该做的事情;或者是当我们想查看优化器为什么要这么选择的时候,可以手动关闭或者打开这些选项来进行优化策略的改变. MySQL 从5.5 和 5.6 开始,增加了更多的开关选项. 下面我来一个一个解释下这些优化开关的含义以及用途.

mysql优化

- - 数据库 - ITeye博客
公司网站访问量越来越大,MySQL自然成为瓶颈,因此最近我一直在研究 MySQL  的优化,第一步自然想到的是 MySQL 系统参数的优化,作为一个访问量很大的网站(日20万人次以上)的数据库系统,不可能指望 MySQL  默认的系统参数能够让 MySQL运行得非常顺畅. 在Apache, PHP,  MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分.

mysql优化

- - 数据库 - ITeye博客
      1.通过 show (session 或者 global) status 来查看( 当前连接 或者 数据库上次开机以来 )的服务器状态信息,默认是session.         例如:show status like '%com_%' : com_XXX表示XXX语句执行的总次数,这总次数是针对所有引擎的总和.

MySQL性能优化

- sun - IT程序员面试网
在笔试面试中,尤其是像百度,淘宝这些数据量非常大,而且用LAMP架构的公司,数据库优化方面就显得特别重要了. 此外,除了数据库索引之外,在LAMP结果如此流行的今天,数据库(尤其是MySQL)性能优化也是海量数据处理的一个热点. 下面就结合自己的经验,聊一聊MySQL数据库优化的几个方面. 首先,在数据库设计的时候,要能够充分的利用索引带来的性能提升,至于如何建立索引,建立什么样的索引,在哪些字段上建立索引,上面已经讲的很清楚了,这里不在赘述.

mysql 引擎优化

- - CSDN博客推荐文章
MySQL数 据库引擎取决于MySQL在安装的时候是如何被编译的. 要添加一个新的引擎,就必须重新编译MYSQL. 在缺省情况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP. 另外两种类型INNODB和BERKLEY(BDB),也常常可以使用. 如果技术高超,还可以使用MySQL++ API自己做一个引擎.

mysql参数优化

- - CSDN博客推荐文章
### 用来存放InnoDB的内部目录,对于大数据设置16M足够用. ### InnoDB 缓存总大小设置,一般设置为系统内存的70%-80%. ### 指定所有InnoDB数据文件的路径和大小分配. ### 文件读写io数设置:. ### InnoDB内核的并发线程数设置. ### 设置日值的大小.

Zabbix 的 MySQL 优化

- - SegmentFault 最新的文章
为 Zabbix 优化 MySQL. 标签(空格分隔): Zabbix MySQL Optimizing 优化. Aurimas Mikalauskas,原文是. Zabbix 和 MySQL. 在大型的 Zabbix 环境中,遇到的挑战大部分是 MySQL 以及更具体的说是 MySQL 磁盘 IO.

mysql优化方法

- - 数据库 - ITeye博客
通过show status和应用特点了解各种SQL的执行频率. 通过SHOW STATUS可以提供服务器状态信息,也可以使用mysqladmin extended-status命令获得. SHOW STATUS可以根据需要显示session级别的统计结果和global级别的统计结果. 以下几个参数对Myisam和Innodb存储引擎都计数:.

Mysql性能优化

- - 数据库 - ITeye博客
MySQL性能优化.   性能优化是通过某些有效的方法来提高MySQL的运行速度,减少占用的磁盘空间. 性能优化包含很多方面,例如优化查询速度,优化更新速度和优化MySQL服务器等.   数据库管理人员可以使用SHOW STATUS语句来查询MySQL数据库的性能. 语法:SHOW STATUE LIKE ‘value’;其中value参数是常用的几个统计参数.

MYSQL设计优化

- - CSDN博客推荐文章
本文将从各方面介绍优化mysql设计的一些方式. (1)定位需要优化的sql语句. 1)show status统计SQL语句频率. 对Myisam和Innodb存储引擎都计数的参数:. SHOW STATUS可以根据需要显示session级别的统计结果和global级别的统计结果. 1.Com_select  执行select操作的次数,一次查询只累加1;.