gpt4 book ai didi

php - TINYTEXT 作为 MySQL 中的主键?

转载 作者:行者123 更新时间:2023-12-05 00:56:07 26 4
gpt4 key购买 nike

表中的条目由 5-10 个字符长的单词唯一标识,我使用 TINYTEXT(10) 作为列。但是,当我尝试将其设置为 PRIMARY 键时,我收到 size 缺失的错误。

根据我对文档的有限理解,PRIMARY 键的 Size 可用于简化检测唯一值的方法,即当前几个字符(由 Size 指定)可以认为它是独一无二的匹配。在我的情况下, size 会从 5 到 10 不同(它们都是 latin1,所以它们是每个字符的精确字节 + 长度为 1)。两个问题:

  1. 如果我想使用 TINYTEXT 作为 PRIMARY 键,我应该指定哪个 size?最大可用 - 在这种情况下为 10?或者应该是 size strictly EXACT,例如,如果我的 key 是 6 个字符长的单词,但我将 PK 的 Size 指定为 10 -它会尝试读取所有 10 个并且会失败并抛出异常?
  2. 使用 [TINY]TEXT 进行 PK 在性能方面会有多糟糕?所有 Google 搜索结果都让我得出“这很糟糕,你被解雇了”的意见和陈述,但考虑到 TINYTEXT 最大为 255 并且我已经将最大长度指定为 10,在这种情况下真的如此吗?

最佳答案

  1. MySQL/MariaDB 只能索引文本字段的第一个字符,如果太大,则不能索引整个文本。最大 key 大小为 3072 字节,任何大于该大小的文本字段都不能用作 KEY。因此,对于超过 3072 字节的文本字段,您必须明确指定它将索引多少字符。使用 VARCHAR 或 CHAR 时可以直接完成,因为您在声明数据类型时明确设置了它。 *TEXT 不是这种情况——他们没有那个选项。解决方案是像这样创建主键:

    CREATE TABLE mytbl (
    name TEXT NOT NULL,
    PRIMARY KEY idx_name(name(255))
    );

    如果您需要在大于 3072 字节的 VARCHAR 字段、BINARY 字段和 BLOB 上创建主键,则可以使用相同的技巧。无论如何,您可以想象,如果两个大而不同的文本在开头的前 3072 个字节处以相同的字符开头,则它们将被系统视为相等。这可能是个问题。

  2. 使用文本字段作为主键通常是个坏主意。有两个原因:

    2.1。需要很多 more processing time而不是使用整数在表中搜索(WHERE、JOINS 等)。该链接已旧但仍然相关;

    2.2。另一个表中的任何外键都必须具有与主键相同的数据类型。当你使用文本时,这会浪费磁盘空间;

注意:*TEXT 和 VARCHAR 的区别在于 *TEXT 字段的内容不存储在表内,而是存储在外部内存位置。通常当我们需要存储非常大的文本时,我们会这样做。

关于php - TINYTEXT 作为 MySQL 中的主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62854035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com