【问题标题】:SQL compound index on multiple tables多个表上的 SQL 复合索引
【发布时间】:2018-12-03 14:30:57
【问题描述】:

我想对跨 sql 表设置复合索引做一点说明。有人可以告诉我是否至少可以使用 h2 数据库?

示例:我有 2 个表格、类别和客户。每个类别都有很多客户。因此,要求是允许一个客户只购买每个类别中的产品 [或者换句话说,每个类别的 customer_id 必须是唯一的]。但是有数百万条记录,所以下面的查询(检查唯一性)不是很有效。

SELECT COUNT(*) 
FROM CATEGORIES c 
INNER JOIN CUSTOMER ct 
on c.CUSTOMER_ID=ct.id 
WHERE c.id = '1' AND ct.EMAIL='joe@xzy.com'

处理需要几秒钟。所以问题是,是否可以为这两个表创建索引,如下所示?

CREATE INDEX "TEST" ON "CATEGORY" ("CUSTOMER_ID") and "CUSTOMER" ON CUSTOMER("EMAIL)

分类

| id | categoryname    | CUSTOMER_ID |
+----+---------+---------+--------------
|  1 |  electronics      |      1      |
|  2 |  food             |      2      |

客户

| id | name  | city     | EMAIL
+----+------------------+-------
|  1 |  Joe  | Newyork   |  joe@xyz.com
|  2 |  Ross | Washington| ross@xzy.com
| .. |  .... | ..... |

【问题讨论】:

  • 索引 ct.email、ct.id 的顺序
  • 据我所知,您无法为多个表创建索引,但您可以生成 View 并根据需要为 View 建立索引。

标签: sql h2


【解决方案1】:

您不需要“跨表的复合索引”之类的东西。您只需要在 categories.CUSTOMER_ID 上建立一个索引,这将加快对您的类别表中某些特定 CUSTOMER_ID 的所有查找。

也就是说,您的设计存在严重问题。您的“类别”表有两个不同的目的:一,说明类别本身,二,说明哪些客户参与了哪些类别。如果您尝试通过规范化理论来看待这一点,或者您尝试为您的表格识别所有“合理”键,您将不可避免地发现您的类别表格必须被拆分分为类别 (id, name) 和 categories_customers_part (category_id, customer_id)。

然后您可以通过在后者上声明复合键 (category_id, customer_id) 来强制执行您的业务规则,您甚至不需要再进行查询了。

【讨论】:

  • 是的,你是对的,但我们在生产环境中有这种设计,改变结构需要付出很多努力。我知道进行查询以检查唯一性确实是个坏主意,但我认为别无选择:(
猜你喜欢
  • 2018-11-05
  • 2017-05-02
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 2017-11-19
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多