我已经阅读了文档(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),但是我想用您自己的话说它是什么以及为什么使用它。
Answers:
分区背后的想法不是使用多个服务器,而是使用多个表而不是一个表。您可以将一个表划分为多个表,以便一个子表中可以包含旧数据,而另一个表中可以包含新数据。然后,数据库可以优化查询,在知道新数据位于第二张表中的情况下,您在其中查询新数据。此外,您可以定义如何对数据进行分区。
来自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年)的不同杂志。分区意味着您将把它们组织在那个大仓库内的不同房间中。它们仍然属于一个仓库,但是现在您根据数据库分区策略在逻辑级别上对它们进行分组。
索引实际上就像保留一张表,以了解哪个杂志在您的仓库中或在您的仓库中的房间中。如您所见,数据库分区和索引编制之间有很大的区别,它们可以很好地结合使用。
您可以在有关数据库分区的这篇文章上在我的网站上阅读有关它的更多信息。