• 8.3.7 InnoDB and MyISAM Index Statistics Collection InnoDB 和MyISAM 索引统计信息收集


    8.3.7 InnoDB and MyISAM Index Statistics Collection InnoDB 和MyISAM 索引统计信息收集

    存储引擎搜集关于表的统计信息用于优化,表统计信息是基于值组的,

    值组是一个行集具有相当的前缀值的Key,对于优化目的,一个重要的统计信息是平均值组大小。

    MySQL 采用平均值组以下面的方式:

    1.评估每次ref 访问需要读取多少记录

    2.评估一个部分关联产生的记录,也就是说,一个操作产生的记录会产生:

    (…) JOIN tbl_name ON tbl_name.key = expr

    由于一个值组大小的平均值用于一个索引增加,索引是不太有用的 对于这2个目的

    因为行的平均数量查询增加, 对于索引最好的优化目的,

    最好的每个索引值目标是表的小部分记录。当给定的Index value 域由大量的记录,

    索引是没用,MySQL 不太可能使用它:

    平均值组和表的基数有关系, 基数是值组的值

    基数(Cardinality) 列唯一键(Distinct_keys)的数量,比如性别,该列只有男女之分,所以这一列基数是2。主键列的基数

    等于行数。

    SHOW INDEX 语句显示了给予N/S的基数,N是表的记录数,S是average value group size.

    这个比例会产生一个近似的值组在表里。

    对于一个练级给予<=> 操作符, NULL 是没有不同于其他值对待 NULL <=> NULL, just as N <=> N for any other N

    然而, 对月一个关联基于=操作的,NULL 是不同于non-NULL 值

    expr1 = expr2 不是真的 当exp1 或者exp2 (或者2者)是空值。

    这会影响ref 访问对于比较 tbl_name.key = expr: MySQL 不会访问表如果当前表达式的值是NULL,

    因为比较不可能是真的:

    对于=比较, 它不影响多少NULL 值会在表里, 对于优化目的,相关的值是non-NULL 值组的平均值

    然而,MySQL 目前不使用平均值来收集或使用。

    For InnoDB and MyISAM tables, 你可以通过 innodb_stats_method and myisam_stats_method 系统变量

    控制表统计信息的搜集,分别,这些变量可以有3个值,不同如下:

    mysql> show variables like ‘%innodb_stats_method%’;
    +———————+————-+
    | Variable_name | Value |
    +———————+————-+
    | innodb_stats_method | nulls_equal |
    +———————+————-+
    1 row in set (0.07 sec)

    当变量设置为nulls_equal,所有的NULL值被认为是相同的(也就是说,它们形成单一的值组)

    如果NULL 值组size 是大于平均的non-NULL 值组大小,这个方法影响平均值组大小。

    这个让索引显示的优化变得不太有用 相比它真的用于关联寻找non-NULL值,

    因此,nulls_equal 方法可能导致优化器不能使用索引对于ref 访问

    当变量设置为nulls_unequal, NULL值不认为是相同的, 每个NULL 值形成一个单组的值组 1

    如果有很多的NULL值, 这个方法会影响平均值组织的正确性。

    如果平均的non-NULL value group size 是大的,继续NULL值 每个值组size 为1 会导致

    优化器过高的估计索引的值 用于关联查找非NULL值。因此,

    nulls_unequal 方法可能导致优化器使用索引用于ref 查找,当其他方法会更好的时候。

    当变量设置为nulls_ignored, NULL 值被忽略:

    如果你倾向于使用很多的关联,使用<=> 相比=,NULL 值不是特别的 在比较一个NULL是等于另外一个。

    在这种情况下,nulls_equal 是适当的统计方法。

    innodb_stats_method 系统变量有一个全局值, myisam_stats_method 系统变量

    有全局值和SESSION 值。

    设置全局值影响统计信息搜集从相应的存储引擎,设置session 值影响统计信息的搜集只是当前客户端连接。

    这个意味着你可以强制一个表的统计信息被重新搜集在不影响其他客户端通过设置myisam_stats_method的session值

    To regenerate MyISAM table statistics, you can use any of the following methods:

    1.执行 myisamchk –stats_method=method_name –analyze

    2.改变表导致它的统计信息淘汰(比如,插入一行然后删除它)

    设置t myisam_stats_method 执行一个ANALYZE TABLE statement

    关于innodb_stats_method和myisam_stats_method使用的一些注意事项:

    你可以强制表统计信息被搜集, 如刚才所描述的。

    然而,MySQL 也自动搜集统计信息。

    比如, 如果在一个表执行语句过程中, 有些语句修改了这个表,MySQL 可能搜集统计信息

    (这个可能会发生对于批量的Inserts或者删除,or some ALTER TABLE statements, for example.)

    如果这个发生,统计信息被搜集使用不管innodb_stats_method or myisam_stats_method的值在那个时间。

    因此,如果你搜集统计信息使用一个方法,但是系统变量是设为为其他方法

    放表的统计信息被自动搜集,另外的方法被使用。

    没有办法告诉方法被使用来产生统计信息 对于一个给定的表

    那些变量只应用于InnoDB 和MyISAM 表, 其他的存储引擎只有一个方法来搜集统计信息,它通常更接近nulls_equal method.

  • 相关阅读:
    spark代码的提交
    单位局域网内的vmware的网络配置
    hive安装配置
    sparkshell中执行wordcount
    解决 在IDEA中使用Maven和Scala新建项目没有自动产生src 以及spark的编译运行配置
    IIS环境下MHT文件预览时弹出下载框的问题解决
    MySql解压版使用
    Oracle 11g OEM登录后提示“出现内部错误”
    如何杀掉(kill)Oracle中的会话(Session)
    IIS发布后出现“如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题”错误
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351266.html
Copyright © 2020-2023  润新知