システムパフォーマンスのボトルネックを避けるために、データベースのデータ量はある程度に達します。データは、パーティショニング、シャーディング、データベース、テーブルを使用して処理する必要があります。
シャーディングは、データベースを複数の物理ノードにスケールアウトする効果的な方法であり、その主な目的は、シングルノード データベース サーバーの I/O 容量制限を解決し、データベースのスケーラビリティの問題を解決します。シャードという言葉は「断片」を意味します。データベースを大きなガラス片として扱い、ガラスが割れた場合、その小さな破片のそれぞれをデータベースの断片 (データベース シャード) と呼びます。データベース全体をいくつかの部分に分割するプロセスはシャーディングと呼ばれます。これはシャーディングと翻訳できます。
正式には、シャーディングは、大規模なデータベースを複数の物理ノードに分散するパーティション化スキームとして単純に定義できます。各パーティションにはスライスと呼ばれるデータベースの特定の部分が含まれており、パーティション分割方法は任意であり、従来の水平パーティションと垂直パーティションに限定されません。シャードには、複数のテーブルまたは複数のデータベース インスタンスの内容を含めることができます。各シャードはデータベース サーバー上に配置されます。データベース サーバーは、1 つ以上のデータ シャードを処理できます。サーバーは、クエリのルーティングと転送のためにシステムに必要であり、実行のためにクエリによってアクセスされるデータを含むシャードまたはシャード コレクション ノードにクエリを転送する役割を担います。
Mysql の拡張ソリューションにはスケールアウトとスケールアップが含まれます。
スケールアウト(水平拡張)とは、アプリケーションを水平方向に拡張できることを意味します。一般に、データセンター アプリケーションの場合、スケール アウトとは、さらに多くのマシンが追加された場合でも、アプリケーションがこれらのマシンのリソースを有効に活用して、自身の効率を向上させ、優れたスケーラビリティを実現できることを意味します。
スケールアップ (垂直方向の拡張) は、アプリケーションが垂直方向に拡張できることを意味します。一般に、単一マシンの場合、スケールアップは価値があり、コンピューティング ノード (マシン) が CPU コアやストレージ デバイスを追加し、より大きなメモリを使用すると、アプリケーションはこれらのリソースを最大限に活用して効率を向上させることができます。優れた拡張性。
MySql のシャーディング戦略には、垂直シャーディングと水平シャーディングが含まれます。
垂直 (垂直) 分割: テーブル間の IO 競合を解決するための機能モジュールによる分割を指します。例えば、注文データベース、商品データベース、ユーザーデータベース… このように、複数のデータベースのテーブル構造は異なります。
水平 (水平) 分割: 同じテーブルのデータをブロックに保存し、それを別のデータベースに保存して、単一テーブルのデータ量増加によるプレッシャーを解決します。これらのデータベースのテーブル構造はまったく同じです。
テーブル構造の設計は縦に分割されています。一般的なシナリオには、
#大きなフィールドの垂直セグメンテーションが含まれます。基本テーブルのアクセス パフォーマンスを向上させるために、別のテーブルに大きなフィールドを個別に構築します。原則として、パフォーマンスが重要なアプリケーションでは、データベースの大きなフィールドは避けるべきです。
垂直セグメンテーションによる使い方に合わせてたとえば、企業のマテリアル属性は、基本属性、販売属性、購買属性、製造属性、財務会計属性などに従って垂直にセグメント化できます。
アクセス頻度に従って垂直にセグメント化されます。たとえば、電子商取引や Web 2.0 システムでユーザー属性の設定が多数ある場合、基本的な頻繁に使用される属性とあまり使用されない属性を垂直に分離できます。デザインは横に分かれています。一般的なシナリオには、次のようなものがあります。
たとえば、オンライン電子商取引 Web サイトでは、注文テーブル データの量が多すぎて、年レベルと月レベルで分割されています。
Web 2.0 Web サイト上の登録ユーザーとオンライン アクティブ ユーザーが多すぎる場合は、ユーザー ID の範囲に従って、関連するユーザーとそのユーザーに密接に関連するテーブルを水平方向にセグメント化します。フォーラムのトップの投稿, ページングの問題のため、各ページにピン留めされた投稿を表示する必要があります。この場合、ピン留めされた投稿を取得するときにすべての投稿のテーブルから読み取られるのを避けるために、ピン留めされた投稿を水平に分割できます
テーブルの分割とは、表面的にはテーブルを複数の小さなテーブルに分割することを意味しますが、パーティショニングはテーブルのデータを N 個の倍数に分割することを意味します。エリア、ブロック、これらは同じディスク上に存在することも、異なるディスク上に存在することもできます。
分表后数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面。分区则不存在分表的概念,分区只不过把存放数据的文件分成了许多小块,分区后的表还是一张表,数据处理还是由自己来完成。
分表后,单表的并发能力提高了,磁盘I/O性能也提高了。分区突破了磁盘I/O瓶颈,想提高磁盘的读写能力,来增加mysql性能。
在这一点上,分区和分表的测重点不同,分表重点是存取数据时,如何提高mysql并发能力上;而分区呢,如何突破磁盘的读写能力,从而达到提高mysql性能的目的。
分表的方法有很多,用merge来分表,是最简单的一种方式。这种方式和分区难易度差不多,并且对程序代码来说可以做到透明的。如果是用其他分表方式就比分区麻烦了。分区实现是比较简单的,建立分区表,跟建平常的表没什么区别,并且对代码端来说是透明的。
一张表的查询速度已经慢到影响使用的时候。
表中的数据是分段的
对数据的操作往往只涉及一部分数据,而不是所有的数据
CREATE TABLE sales ( id INT AUTO_INCREMENT, amount DOUBLE NOT NULL, order_day DATETIME NOT NULL, PRIMARY KEY(id, order_day)) ENGINE=InnodbPARTITION BY RANGE(YEAR(order_day)) ( 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);
一张表的查询速度已经慢到影响使用的时候。
当频繁插入或者联合查询时,速度变慢。
分表的实现需要业务结合实现和迁移,较为复杂。
分表能够解决单表数据量过大带来的查询效率下降的问题,但是,却无法给数据库的并发处理能力带来质的提升。面对高并发的读写访问,当数据库master服务器无法承载写操作压力时,不管如何扩展slave服务器,此时都没有意义了。因此,我们必须换一种思路,对数据库进行拆分,从而提高数据库写入能力,这就是所谓的分库。
与分表策略相似,分库可以采用通过一个关键字取模的方式,来对数据访问进行路由,如下图所示
推荐学习:《mysql视频教程》
以上がMySql のサブテーブル、サブデータベース、シャード、パーティションについて詳しく説明するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。