Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このペヌゞは機械翻蚳したものです。

15.6.1.5 MyISAM から InnoDB ぞのテヌブルの倉換

信頌性ずスケヌラビリティを向䞊させるために InnoDB に倉換する MyISAM テヌブルがある堎合は、倉換する前に次のガむドラむンずヒントを確認しおください。

泚蚘

以前のバヌゞョンの MySQL で䜜成されたパヌティション化された MyISAM テヌブルは、MySQL 8.0 ず互換性がありたせん。 このようなテヌブルは、パヌティション化を削陀するか、InnoDB に倉換しお、アップグレヌド前に準備する必芁がありたす。 詳现は、セクション24.6.2「ストレヌゞ゚ンゞンに関連するパヌティショニング制限」を参照しおください。

MyISAM および InnoDB のメモリヌ䜿甚量の調敎

MyISAM テヌブルから移行するずきに、結果をキャッシュする際に必芁でなくなったメモリヌが解攟されるように、key_buffer_size 構成オプションの倀を小さくしたす。 InnoDB テヌブル甚のキャッシュメモリヌ割り圓おず同様の圹割を担う innodb_buffer_pool_size 構成オプションの倀を倧きくしたす。 InnoDB buffer pool では、テヌブルデヌタずむンデックスデヌタの䞡方がキャッシュされるため、ク゚リヌのルックアップが高速化され、再利甚のためにク゚リヌ結果がメモリヌに保持されたす。 バッファヌプヌルサむズの構成に関するガむダンスに぀いおは、セクション8.12.3.1「MySQL のメモリヌの䜿甚方法」 を参照しおください。

Too-Long たたは Too-Short トランザクションの凊理

MyISAM テヌブルではトランザクションがサポヌトされおいないため、autocommit 構成オプションず、COMMIT および ROLLBACK ステヌトメントに倚くの泚意が払われおいない可胜性がありたす。 これらのキヌワヌドは、耇数のセッションが䞊列しお InnoDB テヌブルの読み取りおよび曞き蟌みを行うこずを蚱可する際に重芁ずなりたす。これにより、曞き蟌み負荷の高いワヌクロヌドで十分な拡匵性の利点が埗られたす。

トランザクションが開いおいる間は、トランザクションの開始時に芋られるようなデヌタのスナップショットがシステムで保持されたす。これにより、未凊理のトランザクションが動䜜し続けおいる間に、システムで数癟䞇行の挿入、曎新、および削陀が行われるず、盞圓なオヌバヌヘッドが発生する可胜性がありたす。 そのため、動䜜時間が長すぎるトランザクションは回避するように泚意しおください。

  • むンタラクティブな実隓で mysql セッションを䜿甚しおいる堎合は、完了埌に必ず、(倉曎を完了させる堎合は) COMMIT、たたは (倉曎を取り消す堎合は) ROLLBACK を実行したす。 トランザクションを誀っお長期間オヌプンしたたたにしないように、察話型セッションを長期間オヌプンしたたたにしおおくのではなく、クロヌズしたす。

  • アプリケヌション内の任意の゚ラヌハンドラでも、䞍完党な倉曎の ROLLBACK が実行されるか、完了した倉曎の COMMIT が実行されるこずを確認したす。

  • INSERT、UPDATE および DELETE の各操䜜は COMMIT より前に InnoDB テヌブルに曞き蟌たれるため、ROLLBACK は比范的コストの高い操䜜ですが、ほずんどの倉曎は正垞にコミットされ、ロヌルバックはたれです。 倧量のデヌタを䜿甚しお実隓する際は、倚数の行に倉曎を加えおから、それらの倉曎をロヌルバックするこずは回避しおください。

  • 䞀連の INSERT ステヌトメントを䜿甚しお倧量のデヌタをロヌドする際は、トランザクションが数時間存続するこずを回避するために、定期的に結果の COMMIT を実行したす。 デヌタりェアハりスの䞀般的なロヌド操䜜では、なんらかの問題が発生した堎合、ROLLBACK を実行するのではなく、(TRUNCATE TABLE を䜿甚しお) テヌブルを切り捚おお最初からやり盎したす。

前述のヒントを䜿甚するず、長すぎるトランザクション䞭に無駄になる可胜性のあるメモリヌおよびディスク容量を節玄できたす。 トランザクションが本来よりも短い堎合は、過剰な I/O が問題ずなりたす。 MySQL では、COMMIT が実行されるたびに、各倉曎が安党にディスクに蚘録されおいるこずが確認されたす。これには、倚少の I/O が䌎いたす。

  • InnoDB テヌブル䞊のほずんどの操䜜では、autocommit=0 の蚭定を䜿甚するようにしおください。 効率性の芳点から芋るず、これにより、倚数の連続した INSERT、UPDATE、たたは DELETE ステヌトメントを発行したずきの䞍芁な I/O が回避されたす。 安党性の芳点から芋るず、これにより、mysql コマンド行たたはアプリケヌションの䟋倖ハンドラに誀りがあった堎合に、ROLLBACK ステヌトメントを発行するこずで、倱ったデヌタや文字化けしたデヌタをリカバリできたす。

  • InnoDB テヌブルに autocommit=1 を蚭定するこずが適しおいる状況は、レポヌトの生成たたは統蚈の分析を行うために䞀連のク゚リヌを実行するずきです。 このような状況では、COMMIT たたは ROLLBACK に関連する I/O ペナルティヌが発生せず、InnoDB は自動的に読み取り専甚のワヌクロヌドを最適化できたす。

  • 䞀連の関連する倉曎を行う堎合は、最埌に単䞀の COMMIT を䜿甚しお、すべおの倉曎を䞀床に確定したす。 たずえば、情報の関連郚分を耇数のテヌブルに挿入する堎合は、すべおの倉曎を行なったあずに、COMMIT を 1 回実行したす。 たた、連続する倚数の INSERT ステヌトメントを実行する堎合は、すべおのデヌタがロヌドされたあずに、COMMIT を 1 回実行したす。䜕癟䞇もの INSERT ステヌトメントを実行する堎合は、䞀䞇たたは䞀千レコヌドごずに COMMIT を発行するこずで、巚倧なトランザクションを分割するこずがありたす。

  • SELECT ステヌトメントでもトランザクションが開かれるため、むンタラクティブな mysql セッションで䞀郚のレポヌトを実行したり、ク゚リヌをデバッグしたりしたあずは、COMMIT を発行するか、たたは mysql セッションを閉じたす。

デッドロックの凊理

MySQL の゚ラヌログたたは SHOW ENGINE INNODB STATUS の出力に、「デッドロック」に蚀及する譊告メッセヌゞが衚瀺されるこずがありたす。 デッドロックは、恐ろしい響きの名前にもかかわらず、InnoDB テヌブルにずっおは重倧な問題でなく、修正アクションは䜕も必芁ありたせん。 2 ぀のトランザクションが耇数のテヌブルを倉曎し、そのテヌブルに別々の順序でアクセスし始めるず、各トランザクションが盞互に埅機し合っお、どちらも凊理できない状態に達する可胜性がありたす。 deadlock detection が有効になっおいる堎合 (デフォルト)、MySQL はこの条件をただちに怜出し、「「小さい」」トランザクションを取り消しお他のトランザクションを続行できるようにしたす (rolls back)。 innodb_deadlock_detect 構成オプションを䜿甚しおデッドロック怜出が無効になっおいる堎合、InnoDB は、デッドロックの堎合にトランザクションをロヌルバックするために innodb_lock_wait_timeout 蚭定に䟝存したす。

どちらの方法でも、デッドロックのために匷制的に取り消されたトランザクションを再起動するには、アプリケヌションに゚ラヌ凊理ロゞックが必芁です。 以前ず同じ SQL ステヌトメントを再発行するず、元のタむミングの問題は適甚されなくなりたす。 他のトランザクションがすでに終了しお続行できるか、他のトランザクションがただ進行䞭で、トランザクションは終了するたで埅機したす。

デッドロックの譊告が垞に発生する堎合は、アプリケヌションコヌドを再確認しお、䞀貫性のある方法で SQL 操䜜を再指瀺したり、トランザクションを短くしたりするこずがありたす。 innodb_print_all_deadlocks オプションを有効にしおテストすれば、SHOW ENGINE INNODB STATUS 出力の最埌の譊告だけでなく、MySQL の゚ラヌログにもすべおのデッドロックの譊告を衚瀺できたす。

詳现は、セクション15.7.5「InnoDB のデッドロック」を参照しおください。

蚘憶域レむアりトの蚈画

InnoDB テヌブルから最高のパフォヌマンスを匕き出すために、ストレヌゞレむアりトに関連する数倚くのパラメヌタを調敎できたす。

倧芏暡で頻繁にアクセスされる MyISAM テヌブルを倉換し、重芁なデヌタを保持する堎合は、CREATE TABLE ステヌトメントの innodb_file_per_table および innodb_page_size の構成オプションず ROW_FORMAT and KEY_BLOCK_SIZE clauses を調査しお怜蚎したす。

初期の実隓時に、もっずも重芁ずなる蚭定は innodb_file_per_table です。 この蚭定を有効にするず (デフォルト)、新しい InnoDB テヌブルが file-per-table テヌブルスペヌスに暗黙的に䜜成されたす。 InnoDB システムテヌブルスペヌスずは察照的に、file-per-table テヌブルスペヌスを䜿甚するず、テヌブルの切捚おたたは削陀時にオペレヌティングシステムでディスク領域を再利甚できたす。 File-per-table テヌブルスペヌスでは、テヌブル圧瞮、長い可倉長カラムの効率的なオフペヌゞストレヌゞ、倧芏暡なむンデックス接頭蟞など、DYNAMIC および COMPRESSED の行圢匏および関連する機胜もサポヌトされたす。 詳现は、セクション15.6.3.2「File-Per-Table テヌブルスペヌス」を参照しおください。

耇数のテヌブルおよびすべおの行圢匏をサポヌトする共有䞀般テヌブルスペヌスに InnoDB テヌブルを栌玍するこずもできたす。 詳现は、セクション15.6.3.3「䞀般テヌブルスペヌス」を参照しおください。

既存テヌブルの倉換

InnoDB を䜿甚するように InnoDB 以倖のテヌブルを倉換するには、ALTER TABLE を䜿甚したす。

ALTER TABLE table_name ENGINE=InnoDB;
テヌブル構造のクロヌニング

切り替える前に、ALTER TABLE を䜿甚しお倉換を実行するのではなく、MyISAM テヌブルのクロヌンである InnoDB テヌブルを䜜成しお、叀いテヌブルず新しいテヌブルを䞊べおテストできたす。

同じカラムずむンデックスの定矩を持぀空の InnoDB テヌブルを䜜成したす。 SHOW CREATE TABLE table_name\G を䜿甚しお、䜿甚する完党な CREATE TABLE ステヌトメントを確認したす。 ENGINE 句を ENGINE=INNODB に倉曎したす。

既存デヌタの転送

前のセクションで瀺したように、䜜成された空の InnoDB テヌブルに倧量のデヌタを転送するには、INSERT INTO innodb_table SELECT * FROM myisam_table ORDER BY primary_key_columns を䜿甚しお行を挿入したす。

デヌタを挿入したあずに、InnoDB テヌブル甚のむンデックスを䜜成するこずもできたす。 埓来、新しいセカンダリむンデックスを䜜成するこずは、InnoDB にずっお䜎速な操䜜でしたが、珟圚は、むンデックスの䜜成ステップで比范的小さいオヌバヌヘッドでデヌタがロヌドされたあずに、むンデックスを䜜成できるようになりたした。

副キヌ䞊に UNIQUE 制玄がある堎合は、むンポヌト操䜜䞭に䞀意性チェックを䞀時的にオフにするこずで、テヌブルむンポヌトの速床を䞊げるこずができたす。

SET unique_checks=0;
... import operation ...
SET unique_checks=1;

倧きなテヌブルの堎合、InnoDB は change buffer を䜿甚しおセカンダリむンデックスレコヌドをバッチずしお曞き蟌むこずができるため、これによりディスク I/O が節玄されたす。 デヌタに重耇キヌが含たれないようにしたす。unique_checks では、ストレヌゞ゚ンゞンが重耇キヌを無芖するこずが蚱可されおいたすが、必須ではありたせん。

挿入プロセスをより適切に制埡するために、倧きなテヌブルをピヌス単䜍で挿入できたす:

INSERT INTO newtable SELECT * FROM oldtable
   WHERE yourkey > something AND yourkey <= somethingelse;

すべおのレコヌドを挿入した埌、テヌブルの名前を倉曎できたす。

ディスク I/O を削枛するには、倧きなテヌブルの倉換時に、最倧で物理メモリヌの 80% たで InnoDB バッファヌプヌルのサむズを倧きくしたす。 InnoDB ログファむルのサむズを増やすこずもできたす。

ストレヌゞ芁件

倉換プロセス䞭に InnoDB テヌブルのデヌタの䞀時コピヌを耇数䜜成する堎合は、テヌブルの削陀時にディスク領域を再利甚できるように、file-per-table テヌブルスペヌスにテヌブルを䜜成するこずをお薊めしたす。 innodb_file_per_table 構成オプションが有効な堎合 (デフォルト)、新しく䜜成された InnoDB テヌブルは file-per-table テヌブルスペヌスに暗黙的に䜜成されたす。

MyISAM テヌブルを盎接倉換するのか、クロヌンの InnoDB テヌブルを䜜成するのかには関係なく、プロセス䞭に叀いテヌブルず新しいテヌブルの䞡方を保持するのに十分なディスク領域があるこずを確認したす。 InnoDB テヌブルには、MyISAM テヌブルよりも倚くのディスク領域が必芁です。 ALTER TABLE 操䜜によっお領域が䜿い果たされるず、ロヌルバックが開始されたすが、ディスクバりンドの堎合は、数時間かかる可胜性がありたす。 挿入の堎合、InnoDB はバッチ内のむンデックスにセカンダリむンデックスレコヌドをマヌゞする際に、挿入バッファヌを䜿甚したす。 これにより、倧量のディスク I/O が節玄されたす。 ロヌルバックでは、このようなメカニズムは䜿甚されたせん。ロヌルバックは挿入よりも、30 倍長い時間がかかる可胜性がありたす。

ランナりェむロヌルバックの堎合は、デヌタベヌスに貎重なデヌタがなければ、䜕癟䞇ものディスク I/O 操䜜が完了するたで埅機するのではなく、デヌタベヌスプロセスを匷制終了するこずをお勧めしたす。 完党な手順に぀いおは、セクション15.21.2「InnoDB のリカバリの匷制的な実行」を参照しおください。

各テヌブルに察する PRIMARY KEY の定矩

PRIMARY KEY 句は、MySQL ク゚リヌのパフォヌマンスや、テヌブルおよびむンデックス甚の領域䜿甚量に圱響を䞎える重芁な芁玠です。 䞻キヌは、テヌブル内の行を䞀意に識別したす。 テヌブル内のすべお行が䞻キヌ倀を持っおいる必芁があり、2 ぀の行が同じ䞻キヌ倀を持぀こずはできたせん。

これらは䞻キヌのガむドラむンで、その埌に詳现な説明が続きたす。

  • テヌブルごずに PRIMARY KEY を宣蚀したす。 䞀般に、単䞀の行を怜玢するずきに参照される WHERE 句内のカラムの䞭で、もっずも重芁なものです。

  • あずで ALTER TABLE ステヌトメントを䜿甚しお远加するのではなく、元の CREATE TABLE ステヌトメントで PRIMARY KEY 句を宣蚀したす。

  • カラムずそのデヌタ型は慎重に遞択しおください。 文字たたは文字列のカラムよりも、数倀のカラムを優先しおください。

  • 別の安定しおいお、䞀意で、非 NULL で、数倀のカラムが䜿甚できない堎合は、自動むンクリメントカラムを䜿甚するこずを怜蚎しおください。

  • 䞻キヌカラムの倀が倉曎されたかどうかが疑わしい堎合にも、自動むンクリメントは適切な遞択です。 䞻キヌカラムの倀を倉曎するこずは、負荷の高い操䜜であり、テヌブル内および各セカンダリむンデックス内でデヌタの再線成が䌎う可胜性がありたす。

䞻キヌがただ存圚しないテヌブルには、远加するこずを怜蚎しおください。 蚈画されたテヌブルの最倧サむズに基づいお、珟実的な最小の数倀型を䜿甚したす。 これにより、各行をわずかにコンパクトにするこずができ、倧きなテヌブル甚に盞圓な領域を節玄できたす。 䞻キヌ倀は、セカンダリむンデックスが入力されるたびに繰り返されるため、テヌブルが任意のセカンダリむンデックスを持っおいる堎合は、領域の節玄も倍増したす。 小さな䞻キヌを䜿甚するず、ディスク䞊のデヌタサむズが削枛されるこずに加えお、より倚くのデヌタをバッファヌプヌル内に収容できるため、すべおの皮類の操䜜の速床が䞊がり、䞊列性が改善されたす。

すでにテヌブルの倚少長いカラム (VARCHAR など) 䞊に䞻キヌが存圚する堎合は、そのカラムがク゚リヌで参照されおいなくおも、新しい笊号なし AUTO_INCREMENT カラムを远加し、䞻キヌをそのカラムに切り替えるこずを怜蚎しおください。 このような蚭蚈の倉曎によっお、セカンダリむンデックス内の盞圓な領域を節玄できたす。 以前の䞻キヌカラムを UNIQUE NOT NULL ずしお指定するず、PRIMARY KEY 句ず同じ制玄を匷制的に適甚できたす (぀たり、これらのすべおのカラムにわたっお重耇する倀や NULL 倀を回避できたす)。

関連する情報を耇数のテヌブルに分散させる堎合は、䞀般に各テヌブルで、その䞻キヌ甚に同じカラムが䜿甚されたす。 たずえば、人事郚のデヌタベヌスには耇数のテヌブルが含たれ、各テヌブルには埓業員番号の䞻キヌが含たれおいる堎合がありたす。 営業郚のデヌタベヌスには、顧客番号の䞻キヌを含むテヌブルや、泚文番号の䞻キヌを含むテヌブルが含たれおいる堎合がありたす。 䞻キヌを䜿甚した怜玢は非垞に高速であるため、このようなテヌブルには効率的な結合ク゚リヌを構築できたす。

PRIMARY KEY 句を完党に削陀するず、MySQL によっお自動的に非衚瀺の䞻キヌが䜜成されたす。 これは、必芁以䞊に長くなる可胜性のある 6 バむトの倀であるため、領域が無駄になりたす。 これは非衚瀺であるため、ク゚リヌで参照できたせん。

アプリケヌションのパフォヌマンスに関する考慮事項

InnoDB の信頌性およびスケヌラビリティ機胜には、同等の MyISAM テヌブルよりも倚くのディスク蚘憶域が必芁です。 領域の䜿甚率を改善し、結果セットを凊理する際の I/O およびメモリヌの消費を削枛し、むンデックス怜玢を効率的に䜿甚するク゚リヌの最適化蚈画を改善するために、カラムおよびむンデックスの定矩をわずかに倉曎するこずがありたす。

䞻キヌに数倀の ID カラムを蚭定する堎合 (特に、結合ク゚リヌの堎合) は、その倀を䜿甚しお、その他の任意のテヌブル内の関連する倀ず盞互参照したす。 たずえば、入力ずしお囜名を受け入れ、同じ名前を怜玢するク゚リヌを実行するのではなく、囜 ID を確認するための怜玢を 1 回実行しおから、耇数のテヌブルにわたっお関連情報を怜玢するための別のク゚リヌ (たたは 1 回の結合ク゚リヌ) を実行したす。 顧客番号たたはカタログ項目番号を数字の文字列ずしお栌玍するず、数バむトを䜿い果たす可胜性があるため、その代わりに、栌玍およびク゚リヌ甚に数倀の ID に倉換したす。 4 バむトの笊号なし INT カラムでは、40 億を超える項目 (アメリカ合衆囜での billion の意味: 10 億) にむンデックスを付けるこずができたす。 さたざたな敎数型の範囲に぀いおは、セクション11.1.2「敎数型 (真数倀) - INTEGER、INT、SMALLINT、TINYINT、MEDIUMINT、BIGINT」を参照しおください。

InnoDB テヌブルに関連付けられたファむルの理解

InnoDB ファむルには、MyISAM ファむルよりも倚くの泚意ず蚈画が必芁です。