在经过多列分区的表格上的索引

时间:2017-07-10 14:55:04

标签: mysql database-partitioning database-indexes

考虑下表(人为的例子):

CREATE TABLE `users_per_service` (
  `host` varchar(50) NOT NULL,
  `port` smallint(6) NOT NULL,
  `user_num` int(10) NOT NULL,
  `user_name` varchar(64) NOT NULL
) PARTITION BY KEY(host, port)

我们已按(host, port)对此进行了分区。我的理解是,将为每个不同的(host, port)元组创建一个物理表。

您可能会看到的数据类型为:

INSERT INTO TABLE `users_per_service`
(host, port, user_num, user_name)
VALUES
('localhost', 8080, 0, 'tom'),
('localhost', 8080, 1, 'jerry'),
('example.com', 8080, 0, 'barry')
('example.com', 8081, 0, 'jeff');

让我们说我只对分区('localhost', 8080)感兴趣 我想要一个按user_num排序的所有用户的列表。

显然这会奏效:

CREATE INDEX service_users_by_num ON users_per_service(host, port, user_num);

SELECT *
FROM users_per_service
WHERE host = 'localhost'
AND port = 8080
ORDER BY host, port, user_num

但我真的需要三列索引吗?我已经(host, port) 分区了。

让我们尝试简化。

以下ORDER BY会使用service_users_by_num索引吗?

CREATE INDEX service_users_by_num ON users_per_service(host, port, user_num);

SELECT *
FROM users_per_service
WHERE host = 'localhost'
AND port = 8080
ORDER BY user_num

多列索引不能通常这样使用。但是对于分区,可以获得一个重要线索:WHERE (host, port)确保我们在一个只有一个可能的主机或端口值的表中。这个可以意味着索引(host, port, user_num)等同于(user_num)上的索引。

我们可以更简单:

CREATE INDEX service_users_by_num ON users_per_service(user_num);

SELECT *
FROM users_per_service
WHERE host = 'localhost'
AND port = 8080
ORDER BY user_num

此查询是否会为我 所选分区('localhost', 8080)的内容,按user_num排序?(即先过滤,然后对结果进行排序 - 而不是相反的方式。)

总体而言:我试图了解多列分区如何与多列索引进行交互。

0 个答案:

没有答案