【问题标题】:How should I index this MySQL db?我应该如何索引这个 MySQL 数据库?
【发布时间】:2010-03-02 21:56:53
【问题描述】:

我正在创建一个允许用户向公众共享特定页面的网站。它类似于 jsbin.com 如何让您创建正在处理的脚本的公共 url。我现在使用的基本 MySQL 表是:

CREATE TABLE IF NOT EXISTS `lists` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `hash` varchar(6) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `hash` (`hash`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

key 字段是保存用户将在 URL 末尾键入的随机字符串的列。因此,例如,如果用户在该页面上发布了哈希值为a1b2c3 的页面,那么 URL 将是http://mysite.com/a1b2c3

好的,很抱歉描述花了这么长时间。我的问题是,我应该索引哈希列吗?这是否会使查询更快,因为我主要是通过哈希值来查找行?

另外,我还有另一个表与这个表有外键关系。将其与哈希列相关联在性能方面是否有意义?

感谢您的帮助。

【问题讨论】:

    标签: mysql database performance database-design


    【解决方案1】:

    您不仅应该在哈希列上建立索引,还应该将其作为主键并去掉多余的id 列。

    还有其他一些您没有在此处列出的表格和/或列吗?此表在created_at 列之外没有什么意义。

    【讨论】:

    • 我忘了提到另一个表与这个表有一个外键多对一的关系。我遇到的另一个问题是,如果哈希列是主键,可以让外键引用这个哈希列吗?
    • 使用varchar 字段作为键可能会考虑性能,但不应禁止。哈希是从什么派生的,预计有多长,您预计表中有多少行?
    • 在一个表(即您的唯一哈希列)中有一个由另一个表中的外键引用的主键确实有意义。
    • 哈希是从大小写字母和数字随机派生的。我可能会将其设为 6 个字符长。大约 3 个月左右后,行可能会被自动删除,所以我一次可能只有大约 400 行。感谢您在这方面的大力帮助!
    • 您可能需要考虑将其设为随机整数,并在 URL 中对其进行 base-36 编码。称它为“哈希”意味着它是一些其他数据的函数,而不是随机分配的标识符;这也为您提供了整数键的速度。
    【解决方案2】:

    是的,如果您通过哈希查找,那么您肯定希望在该字段上有一个索引。从您的表设计的外观来看,您可能希望它也是唯一索引。

    【讨论】:

      【解决方案3】:

      是的。为该列添加UNIQUE INDEX 很重要。首先,您必须确保它是唯一的(嗯...它是一种 ID),并且您将执行大量查询,如下所示:

      SELECT .... FROM .... WHERE hash = 'abc323';
      

      【讨论】:

        【解决方案4】:

        是的,您绝对应该索引hash 列,并且非常重要的是禁用密钥压缩。

        键压缩是MyISAM 索引中的一项功能,它通过仅存储索引键中公共前缀的长度来缩小文本索引的大小。

        这可能有助于提高人类语言短语的性能,但对哈希没有帮助。

        这篇文章来自我的博客,它比较了类似哈希字符串的索引查找性能与打开和关闭键压缩:

        要禁用密钥压缩,请将PACK_KEYS = 0 添加到CREATE TABLE 语句中。

        更新:

        这句话在你的CREATE TABLE:

        UNIQUE KEY `hash` (`hash`)
        

        有效地在hash 上创建了一个UNIQUE 索引,因此您已经拥有它。只需确保关闭密钥压缩即可。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-12
          • 2015-02-10
          • 1970-01-01
          • 2011-10-13
          • 1970-01-01
          • 2017-07-02
          • 1970-01-01
          相关资源
          最近更新 更多