ホームページ  >  記事  >  データベース  >  mysqlでテーブルを分割する方法

mysqlでテーブルを分割する方法

(*-*)浩
(*-*)浩オリジナル
2019-05-31 16:11:302698ブラウズ

データが数百万件になると、1回のクエリにかかる時間が長くなり、結合クエリがあるとそこで死んでしまう可能性があると思います。テーブルパーティショニングの目的は、データベースの負担を軽減し、クエリ時間を短縮することです。

mysqlでテーブルを分割する方法

#サブテーブル

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)
利点: スケーラビリティが高く、プログラム コードはあまり変更されません

欠点: この方法の効果は 2 番目の方法よりわずかに劣ります

以上がmysqlでテーブルを分割する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。