什么是MYSQL分区?

68

我已经阅读了文档 (http://dev.mysql.com/doc/refman/5.1/en/partitioning.html),但我想用您自己的话来解释它是什么以及为什么要使用它。

  1. 它主要用于多个服务器,以避免拖慢单个服务器吗?
  2. 所以,数据的一部分将存储在 server1 上,另一部分将存储在 server2 上。Server3 将“指向” server1 或 server2…这就是它的工作原理吗?
  3. 如果其目的是在不同的服务器上分布数据,为什么 MYSQL 文档专注于同一服务器内的分区呢?
3个回答

190
分区的概念并非使用多个服务器,而是使用多个表格代替一个表格。您可以将一个表格分成多个子表格,以便于将旧数据存储在其中一个子表格中,将新数据存储在另一个表格中。然后数据库可以优化查询,从第二个表格中获取新数据。此外,您可以定义如何分区数据。
来自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
);

这可以加速例如:

  1. 通过简单的方式删除旧数据:

    ALTER TABLE employees DROP PARTITION p0;
    
  2. 数据库可以加速像这样的查询:

  3. SELECT COUNT(*)
    FROM employees
    WHERE separated BETWEEN '2000-01-01' AND '2000-12-31'
    GROUP BY store_id;
    

    知道所有数据都只存储在p2分区上。


41
这是互联网上关于分区的最好的解释。 - Won Jun Bae

2

分区表是由多个物理子表组成的单个逻辑表。分区代码实际上只是一组代表底层分区的处理程序对象的包装器,并通过处理程序对象将请求转发给存储引擎。分区是一种黑盒子,在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 );

点击此处阅读更多相关IT技术内容。


0

这并不是关于使用不同的服务器实例(虽然有时可能会这样做),而是更多地将您的表分成不同的物理分区。

它将您的表和索引分成较小的部分,甚至将其细分为更小的部分。可以将其想象为在一个大仓库(一个大表)中拥有数百万本不同主题和不同年份(例如2000-2019年)的杂志。分区意味着您将它们组织在大仓库内的不同房间中。它们仍然属于同一个仓库,但现在您可以根据数据库分区策略在逻辑级别上对它们进行分组。

索引实际上就像在您的仓库或仓库内的房间中保持一张哪本杂志在哪里的表格。正如您所看到的,数据库分区和索引之间存在很大的区别,它们可以很好地一起使用。

您可以在我的网站上阅读更多关于数据库分区的文章。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接