内部構造から理解するMySQL」をWeb掲載用に再編集したものです。データの操作がイメージできれば誰でもできる』が2019年8月26日に発売されました。本記事と併せてご活用ください。効果的な開発のためのテーブルテクニックここまでの連載ではコーディングの話が続きましたが,今回はゲーム系の開発で効果を出しやすいテクニックをもう1つ紹介します。それは,テーブルのパーティショニングです。Edition限定の機能でした。これはライセンス費が1,000万円超するほど高価で,ユーザもあまり多くありませんでした。そのため,このテクニックの利用はあまり進んでいません。データ量が多いシステムでは非常に有効ですので,ぜひ,理解して利用してください。パーティショニングとはパーティショニングとは,大きいテーブルを特定のカラムのデータによって,内部的に小さいテーブルに分けることです。同じテーブル名でアクセスしても,WHERE句などによって抽出条件がある場合,分割された小さなテーブル(パーティション)や,分割された小さなインデックスのうち必要なものにだけアクセスすることになります。そのため,多くの処理で抽出条件に指定されるカラム(ゲーム系ではユーザIDなど)がある場合,レスポンスやサーバの負荷削減に効果が高い機能です。5.6.7以降ではサブパーティションと合わせて最大8,192個,それより古いバージョンでは1,024個作る(分割する)ことができます。MySQLの制限MySQLでは,パーティショニングキーになるカラムは,プライマリーキー,または,ユニークキーの一部である必要があります。,「⁠外部キー制約がついているテーブルはパーティショニングができない」という制限があります。この制限によって生じるメリットとデメリットをよく検討して利用してください。おもなパーティショニングの種類おもなパーティショニングの種類としては,次の4つがあります。ハッシュパーティショニング(ハッシュ)キーパーティショニング(Key)レンジパーティショニング(Range)リストパーティショニング(List)「⁠ハッシュパーティショニング」とは,整数値のカラムの値を分割する個数で割った余りの値で分割するパーティショニングのことです。ゲーム系ではこのパーティショニングが一番利用されるので,あとで詳しく解説します。「⁠キーパーティショニング(Key⁠)⁠」とは,プライマリーキーに含まれるカラム,あるいは行全体を内部ハッシュ関数で生成した値により分割するパーティショニングのことです。パーティショニングキーが整数値型以外のとき利用します。「⁠レンジパーティショニング(Range⁠)⁠」とは,カラムの範囲を指定して分割するパーティショニングのことです。ゲーム内部にチャットルームがあるとき,チャットの発言日時を必要な範囲で(日別,週別,月別など)分割します。(⁠HDDに余裕があるなら)すべての発言を残しておいても,WHERE句に発言日時での絞り込みを入れておけば,最新の発言しか入っていない小さな内部テーブルのみにアクセスします。保持期限で削除したい場合,DELETE文で削除するとインデックスの更新処理などが必要になるため非常に時間がかかりますが,レンジパーティショニングにしておけば,不要なパーティションをDROP文で捨て去ることができるため高速で処理できます。「⁠リストパーティショニング(List⁠)⁠」とは,明示的に存在するカラムの値ごとに分割するパーティショニングのことです。多言語対応するゲームで,マスタテーブルにLanguageというカラムがあったとすると,このLanguageカラムがあるテーブルすべてをリストパーティショニングで分割します。いうゲームの場合,Languageカラムにインデックス(複合キーを含む)を付けたり,最悪なものとしてはテーブル名にxxxxxx_jp,xxxxxx_enなどという対応をしていたりするということが結構あります。言語の種類は数が少ない(カーディナリティが低い)ため,インデックスはあまり効きません。オプティマイザーがインデックスの利用を非効率と判断する可能性も高く,せっかくインデックスを作っていても利用されないかもしれません。テーブル名を変えると,文字列連結をしてSQL文を構築する必要が出るため好ましくありません。'jp'」などの絞り込みがあるだけで必要最小限のデータのみにアクセスできます。ユーザIDでハッシュパーティショニングRDBMSを利用するほとんどのゲームは,ユーザごとのデータにアクセスすることが非常に多いと思われます。ユーザがガチャを引いてキャラクターを集めていくというゲームで,キャラクターに対してアイテムを複数所持していくとします。この場合,第1回で解説したとおり,リスト1,図1下のようにあえてプライマリーキーをナチュラルキーにし,プライマリーキーの先頭にuser_idを追加することにより,特定のユーザが所有しているキャラクターやアイテムのデータが,ほぼ同じページに保存されることになります。サロゲートキーを採用した場合と,ナチュラルキーを採用した場合のイメージそれに加えて,ユーザIDごとに,それぞれ100個のパーティショニングをすることになります。この場合のハッシュパーティショニングでは,剰余,つまり,ユーザIDの下2桁ごとに分かれますので,ほぼ均等に100分の1になります。Explain)で確認すると,図2のようにそれぞれのテーブルではなく,p34パーティションだけにアクセスしてデータを取得していることがわかります。処理のイメージとしては図3のようになります。p34パーティションからデータを取得する処理のイメージつまり,今回は100個に分割しましたので,リスト2のSQLはユーザ数が100分の1だったとき(100倍のデータ量になっても,第1回で解説したとおりインデックスのブランチの深さは100倍にはならない)と同等のコストで処理できます。パーティショニングの注意点ここまでで,ハッシュパーティショニングについて解説してきました。n」のnを同じ値にする)を行ってください。パーティショニングキー(ユーザID)以外で抽出しようとすると,100個に分割する場合,100個のパーティションを確認することになってしまいます。ユーザグループ(ギルドやクランなどと呼ばれるもの)を作ってマルチユーザでプレイするゲームにおいて,ユーザグループごとの処理が増える場合を想定しましょう。このとき,ユーザグループIDがパーティショニングキーに入っていないと,ユーザグループごとの処理の際,人数の倍数に近いコストがかかります。このような場合は,ユーザグループでパーティショニングを行うほうが良いかもしれません。やみくもにパーティショニングキーを設定するとたいへんなデメリットもありますから注意してください。フリーランスのエンジニアを経て,2003年に株式会社ジーワンシステムを創業する。その後,プレイングマネージャーとして多くのシステム開発に従事し,現在ではデータベースを中心としたコンサルティングを行っている。データの操作がイメージできれば誰でもできる本書は,SQLの文法は学んだもののSQLに苦手意識を持っているITエンジニアのための書籍です。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。