我正在创建一个允许用户向公众分享特定页面的网站。它类似于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
的网页,那么该网址将为http://mysite.com/a1b2c3
好的,抱歉描述花了这么长时间。我的问题是,我应该索引哈希列吗?这会使查询更快,因为我主要通过哈希值来查看行吗?
另外,我有另一个表与这个表有外键关系。将它与哈希列相关联在性能方面是否有意义?
感谢您的帮助。
答案 0 :(得分:1)
您不仅应该对哈希列进行索引,还应该将其作为主键并摆脱冗余的id
列。
您是否还有其他表格和/或列未在此处列出?此表在created_at
列之外几乎没有任何意义。
答案 1 :(得分:0)
是的,如果您通过哈希查找,那么您肯定希望在该字段上有索引。根据表格设计的外观,您可能希望它也是一个独特的索引。
答案 2 :(得分:0)
是的,您肯定应该对hash
列编制索引,这非常重要,禁用密钥压缩。
密钥压缩是MyISAM
索引中的一项功能,它通过仅在索引键中存储公共前缀的长度来缩小文本索引的大小。
这可能有助于提高人类语言短语的表现,但不会对哈希有所帮助。
我的博客中的这篇文章比较了类似哈希的字符串的索引查找的性能以及关键压缩的开启和关闭:
要停用密钥压缩,请将PACK_KEYS = 0
添加到CREATE TABLE
语句。
<强>更新强>
CREATE TABLE
中的此声明:
UNIQUE KEY `hash` (`hash`)
在UNIQUE
上有效创建hash
索引,因此您已拥有它。只需确保关键压缩已关闭。
答案 3 :(得分:0)
是。为该列添加UNIQUE INDEX
非常重要。首先,你必须确保它是独一无二的(嗯......这是一种ID),你会做很多像下面的查询:
SELECT .... FROM .... WHERE hash = 'abc323';