考虑下表(人为的例子):
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
排序?(即先过滤,然后对结果进行排序 - 而不是相反的方式。)
总体而言:我试图了解多列分区如何与多列索引进行交互。