【问题标题】:Creating a MySQL index on a Varchar always makes 2 indexes?在 Varchar 上创建 MySQL 索引总是生成 2 个索引?
【发布时间】:2011-09-01 04:59:12
【问题描述】:

我的表中有一个email 列,即VARCHAR(255)。大多数电子邮件只有 40-50 个字符长,其余字符仅用于极少数情况。因此,我只想索引 email 列的前 50 个字符。

我已经尝试用这个查询来做到这一点:

ALTER TABLE  `users` ADD INDEX (email(50) )

但是,这会创建 2 个索引,一个名为 email,另一个名为 email_2。第一个索引没有长度限制,第二个有 50 个字符的限制。

这是为什么?是否有任何解决方法,或者我别无选择,只能索引整个列?

【问题讨论】:

    标签: mysql database database-design optimization indexing


    【解决方案1】:

    为什么只索引前 50 个字符? MySQL 将足够聪明,仅将索引中的空间用于实际数据。即,它不会为每个条目分配 255 个字符的空间。因此,没有理由不按原样简单地索引整个列。

    【讨论】:

    • 该表会有大量记录,并且会发生很多插入,例如因为用户帐户是从通讯录导入的,您还说没有必要吗?
    • @Click Upvote - 是的,我愿意。无论您使用前 50 个字符还是整个列,索引的基本问题仍然适用。您在写入性能方面做出了很小的牺牲,以换取更大的读取性能提升。这总是一个权衡。如果您使用的是char 而不是varchar,那么在减小索引大小方面可能会出现更多问题。然而,MySQL 足够聪明,varchar 只索引实际数据。
    • 谢谢 - 最后一个问题,您是说带有部分索引的 char 会比使用 varchar 更好,还是带有索引的 varchar 更好?
    • @Click Upvote - 这取决于。 如果我们正在比较两个相同大小的列,并且 if 有大量数据(如果不是 100 百万行,则有 10 百万行),并且 if 所有其他因素都相同(例如数据与所存储内容的完整性),char 可能比 varchar 快一点。当然,唯一确定的方法是实际运行测试。总的来说,我的直觉是,纯粹出于性能原因在两者之间进行选择不会产生任何明显的差异。
    • @Thomas,您的建议是非正统的,我什至可以说这是完全错误的。需要存储索引,并且通常使用前缀索引来减少存储空间,特别是对于名称和名称式列(如电子邮件)。是的,尤其是对于绝大多数行将以重复字符结尾的电子邮件,例如~@gmail.com~@yahoo.com~@yet-another-domain.com 等。添加到索引的每个字符都会产生一个额外的索引存储字符 per行。如果email 是主索引并且还有其他... [cont]
    猜你喜欢
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2013-06-02
    • 2017-06-21
    • 2013-02-15
    • 2018-02-08
    • 1970-01-01
    相关资源
    最近更新 更多