この記事では、例を使用して、MySQL データベースの最適化のためのテーブルおよびデータベース シャーディング操作について説明します。ご参考までに、詳細は以下の通りです。 サブテーブルとサブデータベース垂直分割垂直分割とは、モジュールに応じてテーブルを異なるデータベース テーブルに分割することです (もちろん、原則として第 3 正規形を破壊しません)。この種の分割は、大規模な Web サイトの進化において非常に一般的です。ウェブサイトがまだ非常に小さい場合、開発と保守を行う人数は少なく、すべてのモジュールとテーブルが一緒になっています。ウェブサイトが充実して成長するにつれて、複数のサブシステムによってサポートされるようになります。このとき、モジュールと機能に応じてテーブルを分割する必要があります。実は、垂直分割と比較すると、サービス指向の変革は一歩進んでいます。簡単に言えば、元の強く結合したシステムを複数の弱く結合したサービスに分割し、サービス間の呼び出しを通じてビジネスニーズを満たすことです。したがって、テーブルを分割した後は、異なるモジュールのテーブルを直接呼び出すのではなく、サービスの形で公開する必要があります。タオバオのアーキテクチャの継続的な進化の中で最も重要なのは、サービス指向の変革です。ユーザー、トランザクション、ストア、製品などのコアコンセプトを独立したサービスに抽出することは、ローカル最適化とガバナンスにも非常に役立ち、コアモジュールの安定性を確保します。垂直分割は、分散シナリオで使用されます。 水平分割上記の垂直分割は、テーブルをモジュールごとに異なるデータベースに分割するだけであり、単一のテーブルに大量のデータがあるという問題は解決されません。水平分割は、特定のルールに従って、テーブルのデータを異なるテーブルまたはデータベースに分割することです。たとえば、課金システムでは、システムが一定期間内にデータを処理するため、テーブルを時間で分割する方が適切です。 SaaS アプリケーションの場合、ユーザーは互いに分離されており、通常、複数のユーザー データを処理する必要がないため、ユーザー ディメンションでデータを分割する方が適切です。user_id 範囲で水平に分割するだけです。簡単に言うと、行を水平に分割し、行データを異なるテーブルに分割し、列を垂直に分割し、テーブル データを異なるテーブルに分割します。 スプリットホライズンの例アイデア: 大規模な電子商取引システムでは、メンバーの数は毎日増加し続けています。特定のボトルネックに到達した後にクエリを最適化する方法。 水平分割データベースの使い方ビジネス ニーズに応じて、登録時間、抽選、アカウント ルール、年などに基づいてテーブルを分割するには、水平パーティションを使用します。 タッチ方式でテーブルを分割するまず、user0 / user1 / user2 の 3 つのテーブルを作成し、次に自動増分 ID を提供するために使用される uuid テーブルを作成します。 テーブルuser0を作成( id int 符号なし主キー、 名前 varchar(32) nullでないデフォルト '' pwd varchar(32) NULLでないデフォルト '') エンジン=myisam 文字セット utf8; テーブルuser1を作成します( id int 符号なし主キー、 名前 varchar(32) nullでないデフォルト '' pwd varchar(32) NULLでないデフォルト '') エンジン=myisam 文字セット utf8; テーブルuser2を作成します( id int 符号なし主キー、 名前 varchar(32) nullでないデフォルト '' pwd varchar(32) NULLでないデフォルト '') エンジン=myisam 文字セット utf8; テーブルuuidを作成( id int 符号なし主キー auto_increment)engine=myisam charset utf8; デモプロジェクトを作成するPOM ファイル <親> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <バージョン>1.3.3.RELEASE</バージョン> </親> <依存関係> <依存関係> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </依存関係> <依存関係> <groupId>org.springframework.boot</groupId> <artifactId>スプリングブートスターター</artifactId> </依存関係> <依存関係> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>テスト</scope> </依存関係> <依存関係> <グループID>mysql</グループID> <artifactId>mysql-コネクタ-java</artifactId> </依存関係> <依存関係> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </依存関係> </依存関係> サービスコード @サービス パブリッククラスUserService{ オートワイヤード プライベート JdbcTemplate jdbcTemplate; パブリック文字列regit(文字列名、文字列パスワード) { // 1. まずカスタム成長IDを取得する 文字列 idInsertSQL = "uuid VALUES (NULL) に INSERT INTO"; jdbcTemplate.update(idInsertSQL); Long insertId = jdbcTemplate.queryForObject("last_insert_id() を選択する", Long.class); // 2. ストレージテーブル名を決定します。String tableName = "user" + insertId % 3; // 3. 登録データ String insertUserSql = "INSERT INTO " + tableName + " VALUES ('" + insertId + "','" + name + "','" + pwd + "');"; System.out.println("insertUserSql:" + insertUserSql); jdbcTemplate.update(ユーザーSQLの挿入); 「成功」を返します。 } パブリック文字列 get(Long id) { 文字列 tableName = "user" + id % 3; 文字列 sql = "select name from " + tableName + " where id="+id; System.out.println("SQL:" + sql); 文字列名 = jdbcTemplate.queryForObject(sql, String.class); 名前を返します。 } } コントローラ @レストコントローラ パブリッククラスUserController{ オートワイヤード プライベート UserService userService; @RequestMapping("/regit") パブリック文字列regit(文字列名、文字列パスワード) { userService.regit(名前、パスワード) を返します。 } @リクエストマッピング("/get") パブリック文字列 get(Long id) { 文字列名 = userService.get(id); 名前を返します。 } } MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキル」、および「MySQL データベース ロック関連スキルの概要」 この記事が皆様のMySQLデータベース設計に役立つことを願っています。 以下もご興味があるかもしれません:
|
>>: JavaScript Canvas で三目並べゲームを実装
何人かの学生は、マスターとスレーブの間の不一致の問題に遭遇したと述べました。一般的な状況としては、m...
CSS でレスポンシブ レイアウトを実装するレスポンシブレイアウトは非常にハイエンドで難しいように思...
序文2 つのテーブル内の同じフィールドの型が異なっていたり、エンコード タイプが異なっていたりするた...
序文一般的に、Linux システムについて話すときは、Linux カーネルと GNU プロジェクトに...
1. タイトルHTML では、<h1></h1> から <h6>...
この記事では、参考までにWinにmysqlをインストールする詳細な手順を紹介します。具体的な内容は次...
主に使用される知識ポイント: •css3 3D変換 •ネイティブjsマウスドラッグイベント•表示:グ...
CSS 属性セレクターは素晴らしいです。大量のクラス名を追加することを回避し、コード内の問題を指摘す...
目次マスタースレーブレプリケーションメカニズム非同期レプリケーション準同期レプリケーションマスタース...
場合によっては、フィールドから別の新しいフィールドにデータの列全体をコピーする必要があります。これは...
目次LinuxでTCPを作成する手順サーバクライアントTCP確立プロセスサンプルコードLinuxでT...
JDKをダウンロードしてインストールするステップ 1: まず、公式 Web サイト http://...
LINUX では、定期的なタスクは通常、cron デーモン プロセス [ps -ef | grep ...
序文Linux には、ネットワーク接続、プロセス、およびその他の情報をリアルタイムで収集するための対...
まず、Alibaba Cloud の公式チュートリアルをご覧ください。ファイルの説明: 1. 証明書...