Mysqlテーブルおよび実装
Mysqlデータベースのテーブルと実装
1.現象
プロジェクト開発では、データベースのデータがますます大きくなり、単一のテーブルのデータが多すぎます.クエリの読み取りが遅くなり、テーブルのロックメカニズムによってアプリケーション操作が深刻な影響を及ぼし、データベースのパフォーマンスのボトルネックが発生しました.このような場合、単一のデータベーステーブルを分割し、複数のデータテーブルに分割し、ユーザーがアクセスするときに、一定のアルゴリズムに基づいて、ユーザーに異なるテーブルにアクセスさせることで、データが複数のデータテーブルに分散し、単一のデータテーブルへのアクセス圧力を低減することが考えられます.データベース・アクセスのパフォーマンスが向上しました.
2.例
簡単な構想を行うことができます:今1つのテーブルproductsが製品情報を格納して、今100万人のユーザーがオンラインアクセスして、少なくとも100万回の要求を行います.今、私たちはそれを100のテーブル、すなわちproducts 0~~products 99に分けると、一定のアルゴリズムを利用して私たちは単一のテーブルのアクセス圧力を分担して、各テーブルは1万の要求しかありません(もちろん、これは理想的です!)mysql分割テーブルを実現する鍵は、「いつどのテーブルにアクセスするか」を決定するために良いアルゴリズムを設計することです.
2.1すべてのメンバー情報を格納する完全なテーブルの作成
ポイントデータを追加:
insert into member(id,name,sex) values (1,'jacson','0');
insert into member(name,sex) select name,sex from member;
2番目の文は何度も実行すると多くのデータが得られます.
2.2次は表に分けます.ここでは2つの表に分けます.tbmember 1,tbmember 2
2.3マスターテーブルtb_の作成member
2.4次に、データを2つの表に分けます.
3.プライマリ・テーブルの作成中に次のエラーが発生する可能性があります.
このような間違いに遭遇したら、一般的に2つの面から調べる:(この2つの面から一般的にこの問題を解決することができて、私も出会った.)
1、上のサブテーブルデータベースエンジンがMyISAMかどうかを確認します.
2.サブテーブルと指標のフィールド定義が一致しているかどうかを確認します.
4.Mysql表の3つの方法
4.1 mysqlクラスタを作成します.例えば、mysql cluster、mysql proxy、mysql replication、drdbなどを利用します.
クラスタを作る意味は何ですか?1つのデータベースの負担を軽減するために、はっきり言ってsqlキューの中のsqlの数を減らすことです.例えば、10個のsqlリクエストがあります.1つのデータベースサーバのキューに置くと、彼は長い間待たなければなりません.この10個のsqlリクエストを5個のデータベースサーバのキューに割り当てると、1つのデータベースサーバのキューの中に2個しかありません.このように待つ時間が大幅に短縮されますか.利点:拡張性がよく、複数の表分割後の複雑な操作(phpコード)の欠点がない:単一の表のデータ量はまだ変わっていないが、1回の操作にかかる時間はそんなに多く、ハードウェアのオーバーヘッドが大きい.
4.2大きなデータ量が予想され、頻繁にアクセスするテーブルをいくつかのテーブルに分割
このような見積りは大きくて悪くなくて、フォーラムの中で招待状を発表する表、時間が長くなってこの表はきっと大きくて、数十万、数百万はすべて可能です.チャットルームの中の情報表、数十人が一緒に一晩中話して、時間が長くなって、この表のデータはきっと大きいに違いありません.このような場合が多い.だから、このような予想できるビッグデータ量表は、事前にN個の表を分けて、このNがいくらなのか、実際の状況によって決まります.利点:拡張性がよく、複数の表分割後の複雑な操作(phpコード)の欠点がない:単一の表のデータ量はまだ変わっていないが、1回の操作にかかる時間はそんなに多く、ハードウェアのオーバーヘッドが大きい.
4.3 mergeストレージエンジンによるサブテーブルの実現
この方法は,事前に考慮せずに得られ,データクエリが遅い場合に適している.この时、既存のビッグデータ量表を分けるのが苦痛で、最も苦痛なことはコードを変更することです.プログラムの中のsql文はすでに书いてあるので、今1枚の表は数十枚の表に分けて、百枚以上の表に分けて、このようにsql文は书き直すのではないでしょうか.注意:1.alter tableを使用してmergeテーブルを他のテーブルタイプにすると、レイヤテーブルのマッピングが失われます.代わりに、最下位のmyisamテーブルからのローが交換済みテーブルにコピーされ、その後、新しいタイプが指定されます.2.mergeテーブルは、テーブル全体でunique制約を維持できません.insertを実行すると、insert_methodオプションの値に応じて、最初のmyisamテーブルまたは最後のmyisamテーブルにデータが入ります.mysqlは、そのmyisamテーブルで一意のキー値が保持されていることを確認しますが、集合内のすべてのテーブルにまたがっているわけではありません.3.mergeテーブルを作成するときは、下位テーブルの存在と同じメカニズムがあることを確認していません.mergeテーブルが使用される場合、mysqlは、マッピングされたテーブルごとに記録長が等しいかどうかをチェックするが、これは信頼性が低い.似たようなmyisamテーブルからmergeテーブルを作成しないと、奇妙な問題にぶつかる可能性があります.
注:他のブログを見て整理したのは完全に自分のオリジナルではありません
1.現象
プロジェクト開発では、データベースのデータがますます大きくなり、単一のテーブルのデータが多すぎます.クエリの読み取りが遅くなり、テーブルのロックメカニズムによってアプリケーション操作が深刻な影響を及ぼし、データベースのパフォーマンスのボトルネックが発生しました.このような場合、単一のデータベーステーブルを分割し、複数のデータテーブルに分割し、ユーザーがアクセスするときに、一定のアルゴリズムに基づいて、ユーザーに異なるテーブルにアクセスさせることで、データが複数のデータテーブルに分散し、単一のデータテーブルへのアクセス圧力を低減することが考えられます.データベース・アクセスのパフォーマンスが向上しました.
2.例
簡単な構想を行うことができます:今1つのテーブルproductsが製品情報を格納して、今100万人のユーザーがオンラインアクセスして、少なくとも100万回の要求を行います.今、私たちはそれを100のテーブル、すなわちproducts 0~~products 99に分けると、一定のアルゴリズムを利用して私たちは単一のテーブルのアクセス圧力を分担して、各テーブルは1万の要求しかありません(もちろん、これは理想的です!)mysql分割テーブルを実現する鍵は、「いつどのテーブルにアクセスするか」を決定するために良いアルゴリズムを設計することです.
2.1すべてのメンバー情報を格納する完全なテーブルの作成
create table member(
id bigint auto_increment primary key,
name varchar(20),
sex tinyint not null default '0'
)engine=myisam default charset=utf8 auto_increment=1;
ポイントデータを追加:
insert into member(id,name,sex) values (1,'jacson','0');
insert into member(name,sex) select name,sex from member;
2番目の文は何度も実行すると多くのデータが得られます.
2.2次は表に分けます.ここでは2つの表に分けます.tbmember 1,tbmember 2
DROP table IF EXISTS tb_member1;
create table tb_member1(
id bigint primary key auto_increment ,
name varchar(20),
sex tinyint not null default '0'
)ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
DROP table IF EXISTS tb_member2;
create table tb_member2(
id bigint primary key auto_increment ,
name varchar(20),
sex tinyint not null default '0'
)ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
2.3マスターテーブルtb_の作成member
DROP table IF EXISTS tb_member;
create table tb_member(
id bigint primary key auto_increment ,
name varchar(20),
sex tinyint not null default '0'
)ENGINE=MERGE UNION=(tb_member1,tb_member2) INSERT_METHOD=LAST CHARSET=utf8 AUTO_INCREMENT=1 ;
2.4次に、データを2つの表に分けます.
insert into tb_member1(id,name,sex) select id,name,sex from member where id%2=0;
insert into tb_member2(id,name,sex) select id,name,sex from member where id%2=1;
3.プライマリ・テーブルの作成中に次のエラーが発生する可能性があります.
ERROR 1168 (HY000): Unable to open underlying table which is differently defined
or of non-MyISAM type or doesn't exist
このような間違いに遭遇したら、一般的に2つの面から調べる:(この2つの面から一般的にこの問題を解決することができて、私も出会った.)
1、上のサブテーブルデータベースエンジンがMyISAMかどうかを確認します.
2.サブテーブルと指標のフィールド定義が一致しているかどうかを確認します.
4.Mysql表の3つの方法
4.1 mysqlクラスタを作成します.例えば、mysql cluster、mysql proxy、mysql replication、drdbなどを利用します.
クラスタを作る意味は何ですか?1つのデータベースの負担を軽減するために、はっきり言ってsqlキューの中のsqlの数を減らすことです.例えば、10個のsqlリクエストがあります.1つのデータベースサーバのキューに置くと、彼は長い間待たなければなりません.この10個のsqlリクエストを5個のデータベースサーバのキューに割り当てると、1つのデータベースサーバのキューの中に2個しかありません.このように待つ時間が大幅に短縮されますか.利点:拡張性がよく、複数の表分割後の複雑な操作(phpコード)の欠点がない:単一の表のデータ量はまだ変わっていないが、1回の操作にかかる時間はそんなに多く、ハードウェアのオーバーヘッドが大きい.
4.2大きなデータ量が予想され、頻繁にアクセスするテーブルをいくつかのテーブルに分割
このような見積りは大きくて悪くなくて、フォーラムの中で招待状を発表する表、時間が長くなってこの表はきっと大きくて、数十万、数百万はすべて可能です.チャットルームの中の情報表、数十人が一緒に一晩中話して、時間が長くなって、この表のデータはきっと大きいに違いありません.このような場合が多い.だから、このような予想できるビッグデータ量表は、事前にN個の表を分けて、このNがいくらなのか、実際の状況によって決まります.利点:拡張性がよく、複数の表分割後の複雑な操作(phpコード)の欠点がない:単一の表のデータ量はまだ変わっていないが、1回の操作にかかる時間はそんなに多く、ハードウェアのオーバーヘッドが大きい.
4.3 mergeストレージエンジンによるサブテーブルの実現
この方法は,事前に考慮せずに得られ,データクエリが遅い場合に適している.この时、既存のビッグデータ量表を分けるのが苦痛で、最も苦痛なことはコードを変更することです.プログラムの中のsql文はすでに书いてあるので、今1枚の表は数十枚の表に分けて、百枚以上の表に分けて、このようにsql文は书き直すのではないでしょうか.注意:1.alter tableを使用してmergeテーブルを他のテーブルタイプにすると、レイヤテーブルのマッピングが失われます.代わりに、最下位のmyisamテーブルからのローが交換済みテーブルにコピーされ、その後、新しいタイプが指定されます.2.mergeテーブルは、テーブル全体でunique制約を維持できません.insertを実行すると、insert_methodオプションの値に応じて、最初のmyisamテーブルまたは最後のmyisamテーブルにデータが入ります.mysqlは、そのmyisamテーブルで一意のキー値が保持されていることを確認しますが、集合内のすべてのテーブルにまたがっているわけではありません.3.mergeテーブルを作成するときは、下位テーブルの存在と同じメカニズムがあることを確認していません.mergeテーブルが使用される場合、mysqlは、マッピングされたテーブルごとに記録長が等しいかどうかをチェックするが、これは信頼性が低い.似たようなmyisamテーブルからmergeテーブルを作成しないと、奇妙な問題にぶつかる可能性があります.
注:他のブログを見て整理したのは完全に自分のオリジナルではありません