我已经阅读了文档(http://dev.mysql.com/doc/refman/5.1/en/partitioning.html),但我想用你自己的话来说它是什么以及为什么使用它。
- 它主要用于多台服务器,因此不会拖累一台服务器吗?
- 因此,部分数据将在 server1 上,部分数据将在 server2 上。服务器 3 将“指向”服务器 1 或服务器 2……它是这样工作的吗?
- 为什么 MYSQL 文档专注于在同一服务器内进行分区……如果目的是将其分布在服务器之间?
我已经阅读了文档(http://dev.mysql.com/doc/refman/5.1/en/partitioning.html),但我想用你自己的话来说它是什么以及为什么使用它。
分区背后的想法不是使用多台服务器,而是使用多张表而不是一张表。您可以将一个表拆分为多个表,这样您就可以在一个子表中保存旧数据,在另一个表中保存新数据。然后,数据库可以优化查询,因为您知道它们在第二个表中,因此您需要新数据。此外,您还可以定义数据的分区方式。
MySQL 文档中的简单示例:
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT,
store_id INT
)
PARTITION BY RANGE ( YEAR(separated) ) (
PARTITION p0 VALUES LESS THAN (1991),
PARTITION p1 VALUES LESS THAN (1996),
PARTITION p2 VALUES LESS THAN (2001),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
这允许加快例如:
通过简单删除旧数据:
ALTER TABLE employees DROP PARTITION p0;
数据库可以加速这样的查询:
SELECT COUNT(*)
FROM employees
WHERE separated BETWEEN '2000-01-01' AND '2000-12-31'
GROUP BY store_id;
知道所有数据只存储在 p2 分区上。
分区表是由多个物理子表组成的单个逻辑表。分区代码实际上只是一组代表底层分区的 Handler 对象的包装器,它通过 Handler 对象将请求转发给存储引擎。分区是一种在 SQL 层向您隐藏底层分区的黑盒,尽管您可以通过查看文件系统很容易地看到它们,您将在其中看到具有哈希分隔命名约定的组件表。
例如,这是一种将每年的销售额放入单独分区的简单方法:
CREATE TABLE sales (
order_date DATETIME NOT NULL,
-- Other columns omitted
) ENGINE=InnoDB PARTITION BY RANGE(YEAR(order_date)) (
PARTITION p_2010 VALUES LESS THAN (2010),
PARTITION p_2011 VALUES LESS THAN (2011),
PARTITION p_2012 VALUES LESS THAN (2012),
PARTITION p_catchall VALUES LESS THAN MAXVALUE );
在这里阅读更多。
这实际上并不是关于使用不同的服务器实例(尽管有时这是可能的),它更多的是关于将您的表划分为不同的物理分区。
它将您的表和索引划分为更小的部分,甚至将其细分为更小的部分。可以将其想象为在一个大仓库(一张大桌子)中拥有数百万本不同主题和不同年份(例如 2000-2019 年)的不同杂志。分区意味着您可以将它们组织在那个大仓库内的不同房间中。它们仍然一起属于一个仓库,但现在您根据您的数据库分区策略将它们按逻辑级别分组。
Indexing is actually like keeping a table of which magazine is where in your warehouse, or in your rooms inside your warehouse. As you can see, there is a big difference between database partitioning and indexing, and they can be very well used together.
You can read more about it on my website on this article about Database Partitioning