假设我们有 2 个具有数百万行的相同表并且它们具有业务事务,两个表具有完全相同的信息。一列指定该行是“销售”还是“订单”,其他列指定名称(通常重复)、日期、金额、税金等....
表格中的数据没有组织,因此很明显销售和订单以及其他数据没有以任何方式排序。
唯一的区别是其中一个表有一个额外的列,该列具有其唯一的主键。
如果我使用不涉及主键的相同 WHERE 子句查询具有相同查询的表。一些查询可能涉及:WHERE action = "sale"and name = "Bob Smith"
对于 havix 索引,其中一个会比另一个更快吗??
每个索引都是纯粹的冗余:
- 花费存储空间,
- 占用缓存空间,否则可能会被其他东西占用
- 必须在 INSERT/UPDATE/DELETE 时维护。
如果查询可以使用索引,则加速通常会大大超过上面列出的因素。反之,如果索引没有被使用,那么它就不应该存在。
但在试图删除索引和索引上的键之前,请记住如果数据不正确,性能并不重要。由于应用程序错误1,至少没有主键的表对重复行很开放,不能充当 FOREIGN KEY 的父端点,并且不能在客户端代码中合理识别其行。
要么尝试识别已经“嵌入”在您的数据中的自然主键,要么至少创建一个 surrogate key (就像您在其中一个表格中所做的那样)。
1 严格来说,这样的表甚至不代表关系,这不再是“关系”数据库。关系的数学概念是一个集合,而不是多重集合,这意味着一个元素要么在集合中,要么不在集合中,但不能多次在集合中。