CREATE TABLE relations (
object_id BIGINT(20) NOT NULL PRIMARY KEY,
object_term BIGINT(20) NOT NULL,
UNIQUE KEY link(object_id, object_term),
CONSTRAINT fk_term FOREIGN KEY(object_term)
REFERENCES terms(id) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT fk_object FOREIGN KEY(object_id)
REFERENCES objects(id) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
我有一种感觉,我索引了object_id
3 次和object_term
2 次。我对吗?
如果是,我该如何解决这个问题并仍然保持约束和强制(object_id, object_term)
是唯一的?
好的,第二次尝试:
CREATE TABLE relations (
object_id BIGINT(20) NOT NULL,
object_term BIGINT(20) NOT NULL,
PRIMARY KEY link(object_id, object_term),
CONSTRAINT fk_term FOREIGN KEY(object_term)
REFERENCES terms(id) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT fk_object FOREIGN KEY(object_id)
REFERENCES objects(id) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
这是否更好?
object_id
被索引 3 次PRIMARY KEY
UNIQUE KEY link
FOREIGN KEY fk_object
object_term
实际上被索引一次fk_term
UNIQUE KEY link
中,object_term
不是前导列。更新 2011-12-09 19:42 EDT
在第一次尝试中:
object_id
是唯一的 (PRIMARY KEY
)object_id
,object_term
) 是唯一的(这意味着 object_id 在任何给定时刻只能与一个 object_term 相关联)在第二次尝试中:
object_id
不是唯一的object_id
,object_term
) 是唯一的(这意味着 object_id 只能与多个 object_term 关联)更新 2011-12-09 19:57 EDT
如果您担心索引占用的磁盘空间,您必须做出决定
选项 1:磁盘空间不是对象
只有当您的查询有效地使用覆盖索引并且您愿意使用(并提供)大磁盘空间时,这才是有益的。
选项 2:磁盘空间是宝贵的商品
是时候做一些预测了。两者都是
object_id
BIGINTobject_term
。您可以按如下方式减少一些空间:这不会转储所有行。它将对数据进行采样并返回给定数据的最佳列定义建议。
为什么这很重要?
如果您知道该数字不会超过某些值,您可以更改列定义以容纳更少的磁盘空间。至少,让PROCEDURE ANALYSE()为您推荐它。
选项 3:磁盘空间可能是瓶颈
房客越多,要容纳的客房服务就越多。如果一个主人可以照顾 20 位房客,让他们 20 人都开心,主人也很开心,那么主人总是可以一遍又一遍地照顾 20 位房客。再增加一位客人,主人的服务质量就会下降。索引也是如此。如果您的查询速度足以保证保留索引,您需要选择哪些索引是真正需要的,并消除冗余索引(不想要的客人)。房东必须确保每个房客的请求(查询)都能得到满足(完成覆盖索引)
涵盖索引的好链接