上传项目图片:“Percona Toolkit”雷竞技下载官网
  1. 雷竞技下载官网Percona工具包
  2. pt - 1572

在键中更好地使用ENUM字段

    XML 可打印的

细节

    • 新功能
    • 状态: Done">完成
    • 媒介
    • 解决方法: 固定
    • 此处
    • 3.0.12
    • 没有一个
    • 没有一个

    描述

      当一个键有一个ENUM字段时,TableNibbler需要将ENUM字段包装在一个CONCAT stamentent中,因为MySQL处理这些字段的方式。

      根据文档:http://dev.mysql.com/doc/refman/5.6/en/enum.html#enum-sorting

      ENUM值根据索引号排序,索引号取决于列规范中枚举成员列出的顺序。例如,对于ENUM('b', 'a'), 'b'在'a'之前排序。空字符串在非空字符串之前排序,NULL值在所有其他枚举值之前排序。

      为了防止在ENUM列上使用ORDER BY子句时出现意外结果,可以使用以下技术之一:

      按字母顺序指定ENUM列表。

      通过编码ORDER by CAST(col AS CHAR)或ORDER by CONCAT(col),确保列是按词法排序,而不是按索引号排序。”

      因为在这个例子中特征列被定义为' feature '枚举('FOO','BAR','BAT','BAZ','CAT','DOG','DERP','HERP','VANILLA','CHOCOLATE','MINT')(非字母顺序),所以pt-osc的Nibbler无法计算每个块的边界。

      看到,pt - 272-供参考。
      添加CONCAT会使pt-table checksum等程序变慢(参见pt - 1567

      为了避免这种行为,我们需要做出以下改变:

      1. 使TableParser检测表定义中的ENUM项是否已经排序。
      2. 如果它们没有排序:
        1. 如果——force-concat-enums提供了,继续使用CONCAT包装枚举字段
        2. 如果-force-concat-enums前提是,死的时候能告诉他枚举字段中包含未排序的项,这会导致明显的减速,并告诉用户他应该指定-force-concat-enums
      3. 如果它们已排序,则照常进行使用CONCAT来包装枚举字段

      附件

        问题的链接

          活动

              carlos.salguero卡洛斯Salguero
              carlos.salguero卡洛斯Salguero
              Sveta SmirnovaSveta Smirnova
              投票:
              0 为这个问题投票
              观察人士:
              3. 开始关注这个问题

              日期

                创建:
                更新:
                解决:

                聪明的清单