如何高效快速地优化MySQL、SQL语句(附源码)(3)
系统参数很多,下面介绍几个.
排序区大小.其大小直接影响排序使用的算法.如果系统中排序都比较大、内存充足且并发量不是很大的情况,可以适当增加此参数.这个参数是针对单个Thead的.
Join操作使用内存区域大小.只有当Join是ALL、index、range或index_merge时使用到Join Buffer.如果join语句较多,可以适当增大join_buffer_size.需要注意到是,这个值针对单个Thread.每个Thread都会自己创建独立的Buffer,而不是整个系统共享的Buffer,不要设置过大而造成系统内存不足.
如果内存内的临时表超过该值,MySQL自动将它转换为硬盘上的MyISAM表.如果执行许多高级GROUP BY查询并且有大量内存,则可以增加tmp_table_size的值.
读查询操作所能使用的缓冲区大小.这个参数是针对单个Thead的. 在MySQL中,还有一些参数是可以用来控制优化器行为的.
这个参数控制优化器在穷举执行计划时的限度.如果查询长时间处于”statistics”状态,可以考虑调低此参数.
默认是打开的,这让优化器会根据需要扫描的行数来决定是否跳过某些执行计划.
这个变量包含了一些开启/关闭优化器特性的标志位. 示例 — 干预优化器行为(ICP特性) 默认情况下,ICP特性是开启的.查看一下优化器行为. 基于二级索引的过滤查询,使用了ICP特性,从Extra中的”Using index condition”可见.如果通过优化器开关,干预优化器行为,又会如何呢? 从Extra可见,ICP特性已经禁用. 5、系统状态(SHOW STATUS)MySQL中也内置了一些状态,通过这些状态变量也可反映出语句执行的一些情况,方便定位问题.手工执行的话,可以在执行语句的前后分别执行SHOW STATUS命令,查看状态的变化.当然,因状态变量很多,对比起来不太方便,后面我介绍的小工具,可以解决这个问题. 状态变量很多,这里介绍几个.
排序算法已经执行的合并的数量.如果这个变量值较大,应考虑增加sort_buffer_size系统变量的值.
在范围内执行的排序的数量.
已经排序的行数.
通过扫描表完成的排序的数量.
索引中第一条被读的次数.读取索引头的次数,如果这个值很高,说明全索引扫描很多.
根据键读一行的请求数.如果较高,说明查询和表的索引正确.
按照键顺序读下一行的请求数.如果你用范围约束或如果执行索引扫描来查询索引列,该值增加.
按照键顺序读前一行的请求数.
(编辑:ASP站长网) |