mysql - 在这种情况下,为什么允许 utf8mb4 编码的 MariaDB(版本 10.1.35)索引前缀超过 767 个字节?

标签 mysql ruby-on-rails database mariadb prefix

我已阅读this question我尝试在我的案例中测试它,但我不明白它为什么起作用。

我使用的是 Rails 和 utf8mb4 编码的 MariaDB(版本 10.1.35)

我的架构中有这个:

  create_table "settings", force: :cascade do |t|
    t.string   "var",         limit: 255,   null: false
    t.text     "value",       limit: 65535
    t.integer  "target_id",   limit: 4,     null: false
    t.string   "target_type", limit: 255,   null: false
    t.datetime "created_at",                null: false
    t.datetime "updated_at",                null: false
  end

  add_index "settings", ["target_type", "target_id", "var"],
       name: "index_settings_on_target_type_and_target_id_and_var",
       unique: true,
       length: {"target_type"=>191,
                "target_id"=>nil,
                "var"=>191}, using: :btree

我做了rake db:schema:load并且它通过了,没有任何问题。我认为它应该显示错误,因为 innoDB 索引前缀限制是 767 字节,在这种情况下我们超出了限制:

191*4 + 191*4 = 1528 超过 767

有人能解释一下为什么它仍然有效吗?

我正在努力理解索引、索引键和索引前缀之间的区别。如果有人可以列出一个资源供我学习这些,那就太好了。

我读过的内容:

最佳答案

索引是维护直接(或更好地访问)行的信息的对象。为此,索引存储列值,索引中涉及的列被命名为键。索引前缀是一部分(左侧字符串) key 中的值以减少索引空间..(如果前缀始终相同是没有用的)

191 x 4 = 764 (< 767)

192 x 4 = 768 (> 767)

值 767 是每个键的值,而不是总数

Prefix support and lengths of prefixes (where supported) are storage engine dependent. For example, a prefix can be up to 767 bytes long for InnoDB tables

https://dev.mysql.com/doc/refman/8.0/en/create-index.html

所以 191x4 用于关键 target_type 和 191x4 用于关键 var 工作

关于mysql - 在这种情况下,为什么允许 utf8mb4 编码的 MariaDB(版本 10.1.35)索引前缀超过 767 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51853501/

相关文章:

ruby-on-rails - Ruby on Rails-回形针回滚交易

java - 通过 JPA 为 MySQL 节省时间

mysql - 如何获得MySQL行的最大大小?

mysql - Spring批处理从xml文件读取并写入数据库。需要步骤 1 自动生成步骤 2 的 key

java - 从 Java GUI 将数据插入数据库

sql - 返回包含最近 24 小时计数的记录

mysql - 有没有办法在 mysql 服务器和本地 MS Access 之间同步(双向)表?

mysql - 如何创建数据库的副本,包括 Windows 中的表(mysql)

Rails 中的 HTML,对齐来自不同文件的链接和后退按钮

ruby-on-rails - 没有路由匹配 [POST] "/sessions/user"