データが数百万件になると、1回のクエリにかかる時間が長くなり、結合クエリがあるとそこで死んでしまう可能性があると思います。テーブルパーティショニングの目的は、データベースの負担を軽減し、クエリ時間を短縮することです。
#サブテーブル
1、mysql クラスターを作成します。例: mysql クラスター、mysql プロキシ、mysql レプリケーション、drdb などを使用します。
mysql クラスターはサブテーブルと何か関係があるのかと疑問に思う人もいるかもしれません。本当の意味ではサブテーブルではありませんが、サブテーブルの役割を果たします。クラスターになるとはどういう意味ですか?データベースの負担を減らすとは、端的に言えば、SQLキュー内のSQLの数を減らすことです。 例: 10 個の SQL リクエストがあり、データベース サーバーのキューに入れられると、長時間待機する必要があります。この 10 個の SQL リクエストが 5 つのデータベースのキューに割り当てられるとします。サーバー データベースサーバーのキューは2つしかありませんが、待ち時間は大幅に短縮されますか?これはすでに明らかです。 利点: 優れたスケーラビリティ、複数のテーブル後の複雑な操作 (PHP コード) が不要、ハードウェアのオーバーヘッドが大きい。2. データ量が多く頻繁にアクセスされるテーブルが存在することを事前に予測し、複数のテーブルに分割します。悪くないよ、フォーラム 投稿が投稿されるテーブルは、時間の経過とともに間違いなく非常に大きくなり、おそらく数十万、さらには数百万にもなります。チャットルームの情報テーブルでは、数十人が一晩中チャットしたため、長い時間が経つと、このテーブルのデータは非常に大きくなるはずです。このような状況はたくさんあります。そこで、このようなビッグデータの推定可能な規模については、事前にN個のテーブルに分割しておきますが、N個の数は実際の状況に応じて異なります。
利点: 1 つのテーブルに数百万のデータが含まれることを回避し、SQL の実行時間を短縮します。
欠点: ルールが決定されると、このルールを破るのは非常に困難になります。問題は、上記の例で使用したハッシュ アルゴリズムは crc32 です。このアルゴリズムを今使用したくない場合、md5 に切り替えると、同じユーザーのメッセージが別のテーブルに保存されるため、データが台無しになります。スケーラビリティが低い。3、マージ ストレージ エンジンを使用してテーブル パーティショニングを実装します。
こちらの方法の方が適していると思います。事前の考慮なしに登場したものは、データ クエリの速度を低下させる原因になります。 。このとき、既存のビッグデータスケールを分離することの方が大変ですが、プログラム内のSQL文はすでに書かれているため、コードを変更するのが最も大変です。テーブルを数十、あるいは数百のテーブルに分割する必要があるということは、SQL ステートメントを書き直す必要があるということでしょうか?たとえば、mrg_myisam が実際にマージされていることがわかる場合、私は
mysql>show エンジンを使用するのが好きです。 mysql> CREATE TABLE IF NOT EXISTS `user1` (
-> `id` int(11) NOT NULL AUTO_INCREMENT,
-> `name` varchar(50) DEFAULT NULL,
-> `sex` int(1) NOT NULL DEFAULT '0',
-> PRIMARY KEY (`id`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Query OK, 0 rows affected (0.05 sec)
mysql> CREATE TABLE IF NOT EXISTS `user2` (
-> `id` int(11) NOT NULL AUTO_INCREMENT,
-> `name` varchar(50) DEFAULT NULL,
-> `sex` int(1) NOT NULL DEFAULT '0',
-> PRIMARY KEY (`id`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO `user1` (`name`, `sex`) VALUES('张映', 0);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `user2` (`name`, `sex`) VALUES('tank', 1);
Query OK, 1 row affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `alluser` (
-> `id` int(11) NOT NULL AUTO_INCREMENT,
-> `name` varchar(50) DEFAULT NULL,
-> `sex` int(1) NOT NULL DEFAULT '0',
-> INDEX(id)
-> ) TYPE=MERGE UNION=(user1,user2) INSERT_METHOD=LAST AUTO_INCREMENT=1 ;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> select id,name,sex from alluser;
+----+--------+-----+
| id | name | sex |
+----+--------+-----+
| 1 | 张映 | 0 |
| 1 | tank | 1 |
+----+--------+-----+
2 rows in set (0.00 sec)
mysql> INSERT INTO `alluser` (`name`, `sex`) VALUES('tank2', 0);
Query OK, 1 row affected (0.00 sec)
mysql> select id,name,sex from user2
-> ;
+----+-------+-----+
| id | name | sex |
+----+-------+-----+
| 1 | tank | 1 |
| 2 | tank2 | 0 |
+----+-------+-----+
2 rows in set (0.00 sec)
利点: スケーラビリティが高く、プログラム コードはあまり変更されません
以上がmysqlでテーブルを分割する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。