我正在查看 WordPress 中的表定义查询,并注意到一些奇怪的事情。首先,查询是这样的:
CREATE TABLE $wpdb->comments (
comment_ID bigint(20) unsigned NOT NULL auto_increment,
comment_post_ID bigint(20) unsigned NOT NULL default '0',
comment_author tinytext NOT NULL,
comment_author_email varchar(100) NOT NULL default '',
comment_author_url varchar(200) NOT NULL default '',
comment_author_IP varchar(100) NOT NULL default '',
comment_date datetime NOT NULL default '0000-00-00 00:00:00',
comment_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',
comment_content text NOT NULL,
comment_karma int(11) NOT NULL default '0',
comment_approved varchar(20) NOT NULL default '1',
comment_agent varchar(255) NOT NULL default '',
comment_type varchar(20) NOT NULL default 'comment',
comment_parent bigint(20) unsigned NOT NULL default '0',
user_id bigint(20) unsigned NOT NULL default '0',
PRIMARY KEY (comment_ID),
KEY comment_post_ID (comment_post_ID),
KEY comment_approved_date_gmt (comment_approved,comment_date_gmt),
KEY comment_date_gmt (comment_date_gmt),
KEY comment_parent (comment_parent),
KEY comment_author_email (comment_author_email(10))
) $charset_collate;
如您所见,comment_author_email
被定义为varchar(100)
,但其键被定义为 10 个字符的长度。这是为什么?由于大多数电子邮件的长度约为 10-15 个字符,是为了节省空间吗?
在这种情况下,这是否意味着 - 对于长度为 15 个字符的电子邮件 - 前 10 个字符将被索引,其余 5 个字符将不被索引?是这样的吗? (正如您所猜测的那样,我不是数据库专家)。
最后,我将为我正在构建的机制添加一个自己的表,该表需要存储电子邮件地址和电话号码。对于电子邮件地址,我将使用类似的定义。至于手机,为了安全起见,我想将其定义为 varchar(25),但对于其索引,再次使用长度为 10 个字符的密钥。对于这个规划你怎么看?
摆脱
comment_
;正是混乱使事情变得不那么可读。“前缀”几乎没有什么好处——无论是速度还是空间。也就是说,不要说
简单地说
你的 15 个例子中的 10 个:是的,它节省了 5 个字符。但这会影响使用该索引的所有查询的速度。