AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 6607
Accepted
Rick James
Rick James
Asked: 2011-10-08 10:49:29 +0800 CST2011-10-08 10:49:29 +0800 CST 2011-10-08 10:49:29 +0800 CST

表分区有什么帮助?

  • 772

我很难理解表分区的优缺点。我即将开始一个项目,该项目将有 8 个表,其中一个将是主数据表,将保存 180-2.6 亿条记录。因为它将是正确索引的表,所以我正在考虑将表记录限制为 2000 万,这样我就必须创建 9-13 个表。

但是我不太确定它将如何提高性能,因为它们将位于同一台机器上(32GB RAM)?

我正在使用 MySQL,表将是 MyISAM,大表将在 id 字段上有索引,并且没有像全文搜索等进一步的复杂性。

还请阐明表分区与数据库分区。

mysql database-design
  • 3 3 个回答
  • 20548 Views

3 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2011-10-08T12:20:15+08:002011-10-08T12:20:15+08:00

    以下只是疯狂的咆哮和咆哮......

    如果将所有数据保留在一个表中(无分区),则使用键的搜索时间为 O(log n)。让我们以世界上最糟糕的索引二叉树为例。每个树节点只有一个键。具有 268,435,455 (2^28 - 1) 个树节点的完美平衡二叉树的高度为 28。如果将此二叉树拆分为 16 棵独立的树,您将得到 16 棵二叉树,每棵树有 16,777,215 (2^24 - 1)高度为 24 的树节点。搜索路径减少了 4 个节点,高度减少了 14.2857 %。如果搜索时间以微秒为单位,则搜索时间减少 14.2857 % 几乎可以忽略不计。

    现在在现实世界中,BTREE 索引将具有带有多个键的树节点。每个 BTREE 搜索都会在页面内执行二进制搜索,并可能下降到另一个页面。例如,如果每个 BTREE 页面包含 1024 个键,则树高 3 或 4 将是常态,实际上是短树高。

    请注意,表的分区不会降低已经很小的 BTREE 的高度。给定 2.6 亿行的分区,甚至很有可能拥有多个具有相同高度的 BTREE。每次搜索一个键可能会经过所有根 BTREE 页面。只有一个会满足所需搜索范围的路径。

    现在对此进行扩展。所有分区都存在于同一台机器上。如果每个分区没有单独的磁盘,那么磁盘 I/O 和主轴旋转将成为分区搜索性能之外的自动瓶颈。

    在这种情况下,如果 id 是唯一被使用的搜索键,那么按数据库分区也不会给您带来任何好处。

    数据分区应该用于对在同一类中逻辑和内聚的数据进行分组。只要数据被正确分组,搜索每个分区的性能不必是主要考虑因素。一旦你实现了逻辑分区,然后专注于搜索时间。如果您仅按 id 分隔数据,则可能永远不会访问许多数据行以进行读取或写入。现在,这应该是一个主要考虑因素:找到所有最常访问的 id 并按. 所有不经常访问的 id 都应该驻留在一个大存档表中,该存档表仍然可以通过索引查找来访问“蓝月亮”查询。

    总体影响应该是至少有两个分区:一个分区用于频繁访问的 id,另一个分区用于其余 id。如果经常访问的 id 的数量相当大,您可以选择对其进行分区。

    • 35
  2. ConcernedOfTunbridgeWells
    2011-10-11T02:24:41+08:002011-10-11T02:24:41+08:00

    2 亿行肯定在您可以从表分区中受益的范围内。根据您的应用程序,您可以打赌下面列出的一些好处:

    • 易于清除旧数据如果您需要清除(例如)6 个月以上的记录,您可以按日期对表进行分区,然后换出旧分区。这比从表中删除数据要快得多,并且通常可以在实时系统上完成。在 OP 的情况下,这可能有助于系统维护。

    • 多个磁盘卷分区允许您拆分数据以在多个磁盘卷之间分配磁盘流量以提高速度。使用现代 RAID 控制器,这对 OP 来说不太可能成为问题。

    • 更快的表和范围扫描实际上,操作系统不应该做这种事情,但是数据仓库或类似的系统会大量做这种查询。表扫描主要使用顺序磁盘流量,因此它们通常是处理返回表中超过百分之几行的查询的最有效方式。

      如果可以根据分区键解析谓词,则通过公共过滤器(通常基于时间或周期)进行分区允许从此类查询中消除表的大块。它还允许将表拆分为多个卷,这可以为大型数据集带来显着的性能提升。通常,这对于操作系统来说不是问题。

    出于 OP 的目的,分区不太可能为操作查询带来太多性能优势,但它可能对系统管理很有用。如果对报告大量数据的聚合有任何重要要求,那么适当的分区方案可能会有所帮助。

    • 17
  3. Bill
    2014-07-15T13:10:04+08:002014-07-15T13:10:04+08:00

    如果所有索引都已分区,则分区允许按分区进行并发重组。如果不是,分区仍然小得多,并且使用更少的工作空间进行重组。而且,在内部,任何“好的”DBMS 都可以与分区表并行执行。这可能不包括 MySQL 或 MyISAM,虽然....

    • 1

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve