我已阅读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/