设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 服务器 > 安全 > 正文

如何高效快速地优化MySQL、SQL语句(附源码)(3)

发布时间:2021-01-07 19:30 所属栏目:53 来源:网络整理
导读:Table:表名. Non_unique:0,如果索引不能包含重复. Key_name:索引名 Seq_in_index:索引中的列顺序号,从1开始. Column_name:列名. Collation:列怎样在索引中被排序.在MySQL中,这可以有值A(升序)或NULL(不排序).

  • Table:表名.
  • Non_unique:0,如果索引不能包含重复.
  • Key_name:索引名
  • Seq_in_index:索引中的列顺序号,从1开始.
  • Column_name:列名.
  • Collation:列怎样在索引中被排序.在MySQL中,这可以有值A(升序)或NULL(不排序).
  • Cardinality:索引中唯一值的数量.
  • Sub_part:如果列只是部分被索引,索引字符的数量.当整个字段都做索引了,那么它的值是NULL.
  • Packed:表示键值是如何压缩的,NULL表示没有压缩.
  • Null:当字段包括NULL的记录是YES,它的值为,反之则是”.
  • Index_type:使用了哪种索引算法(有BTREE、FULLTEXT、HASH、RTREE).
  • Comment:备注.
  • 系统参数:系统参数也会影响语句的执行效率.查看系统参数,可使用SHOW VARIABLES命令.
参数说明

系统参数很多,下面介绍几个.

  • sort_buffer_size

排序区大小.其大小直接影响排序使用的算法.如果系统中排序都比较大、内存充足且并发量不是很大的情况,可以适当增加此参数.这个参数是针对单个Thead的.

  • join_buffer_size

Join操作使用内存区域大小.只有当Join是ALL、index、range或index_merge时使用到Join Buffer.如果join语句较多,可以适当增大join_buffer_size.需要注意到是,这个值针对单个Thread.每个Thread都会自己创建独立的Buffer,而不是整个系统共享的Buffer,不要设置过大而造成系统内存不足.

  • tmp_table_size

如果内存内的临时表超过该值,MySQL自动将它转换为硬盘上的MyISAM表.如果执行许多高级GROUP BY查询并且有大量内存,则可以增加tmp_table_size的值.

  • read_buffer_size

读查询操作所能使用的缓冲区大小.这个参数是针对单个Thead的.

4、优化器开关

在MySQL中,还有一些参数是可以用来控制优化器行为的.

参数说明
  • optimizer_search_depth

这个参数控制优化器在穷举执行计划时的限度.如果查询长时间处于”statistics”状态,可以考虑调低此参数.

  • optimizer_prune_level

默认是打开的,这让优化器会根据需要扫描的行数来决定是否跳过某些执行计划.

  • optimizer_switch

这个变量包含了一些开启/关闭优化器特性的标志位.

示例 — 干预优化器行为(ICP特性)

默认情况下,ICP特性是开启的.查看一下优化器行为.

基于二级索引的过滤查询,使用了ICP特性,从Extra中的”Using index condition”可见.如果通过优化器开关,干预优化器行为,又会如何呢?

从Extra可见,ICP特性已经禁用.

5、系统状态(SHOW STATUS)

MySQL中也内置了一些状态,通过这些状态变量也可反映出语句执行的一些情况,方便定位问题.手工执行的话,可以在执行语句的前后分别执行SHOW STATUS命令,查看状态的变化.当然,因状态变量很多,对比起来不太方便,后面我介绍的小工具,可以解决这个问题.

状态变量

状态变量很多,这里介绍几个.

  • Sort_merge_passes

排序算法已经执行的合并的数量.如果这个变量值较大,应考虑增加sort_buffer_size系统变量的值.

  • Sort_range

在范围内执行的排序的数量.

  • Sort_rows

已经排序的行数.

  • Sort_scan

通过扫描表完成的排序的数量.

  • Handler_read_first

索引中第一条被读的次数.读取索引头的次数,如果这个值很高,说明全索引扫描很多.

  • Handler_read_key

根据键读一行的请求数.如果较高,说明查询和表的索引正确.

  • Handler_read_next

按照键顺序读下一行的请求数.如果你用范围约束或如果执行索引扫描来查询索引列,该值增加.

  • Handler_read_prev

按照键顺序读前一行的请求数.

  • Handler_read_rnd

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读