jumper

コラム

MySQLの最適化

2019年06月19日
MySQLの最適化

MySQLはその仕組み上、どうしてもオーバーヘッドが発生します。このオーバーヘッドを解消する手段として最適化があります。しかし、オーバーヘッドが発生しにくい設計を行うことも大切です。同時にクエリーについても最適化を実施したいものです。MySQLの設計および運用では、その最適化は必須ともいえるポイントです。ここではSQLステートメント、インデックスの在り方、そしてデータベース構造について最適化がどのように関わっているかみてみましょう。

SQLステートメントの最適化

MySQLに限らず、RDB(リレーショナルデータベース)では、SQL文の発行でデータベースを操作します。このSQL文をSQLステートメントといいます。また、SQLステートメントにも「SELECTステートメント」「DMLステートメント」など種類が分かれていますが、それぞれが最適化されていることでパフォーマンスを発揮できます。

「SELECT ステートメント」はデータベースを参照する際に使われます。そのため、ここで最適化がなされていないと、検索速度の低下、システムの高負荷などが起きる可能性があります。適切なインデックスが実施されているか、WHERE句が最適化されているか、LEFT JOINやINNER JOIN、外部結合の単純化など、検討次第でそのパフォーマンスは各段に変わってきます。参照系が「SELECTステートメント」であるのに対し、操作系は「DMLステートメント」になります。INSERT、UPDATE、DELETEの操作が「DMLステートメント」(Data Manipulation Language)にあたるといえます。MySQLの主戦場としてはウェブサービスを挙げられますが、近年のウェブサービスでは非常に多くのDML操作が実施されています。大量のデータの書き込みや更新が要求されるサービスでは、操作の並列性やインデックスの最新化、オーバーヘッドの最適化が重要になります。

その他に、データベースの権限に対する最適化も重要です。RANTステートメントによるデータベース権限のセットアップは、その後の「SELECTステートメント」「DMLステートメント」の実施に大きな影響を与えます。

最適化とインデックス

MySQLに用意されているインデックスは、参照系操作の際に迅速にルックアップするために利用されます。このインデックスを上手に設定することがMySQLを高速に、かつ効率的に運用する要諦といえます。インデックスがないと、関連する情報を検索するために全行を探索していくことになり、そのコストはテーブルが大きいほど上がっていきます。つまり検索に時間がかかってしまいます。

しかし、インデックスはすべてのクエリーにとって必要だとはいえません。不要なインデックスはパフォーマンスの低下につながることもあり、最適化と反対の方向に向くことがあります。適切なインデックスの作成があってこそ、WHERE句に対して迅速な検索が実施されるのです。

インデックスは、主キー、外部キー、または複合インデックスなどの使い方によって高速化が実現可能になります。

データベース構造の最適化

データベースそのものの構造も最適化を考える必要があります。スキーマ、テーブルとカラムの構造が適切に作成されていることで、高速で効率的なデータベースの運用が期待できるのです。特にデータのボリュームが増えると当初に想定していたパフォーマンスを発揮できなくなることがあります。データが読み書きされる度に不要なディスク領域が増え、速度が遅くなっていきます。その点では、なるべくディスク領域をミニマムに設計するようにしましょう。読み書きについてのコストを落とすことが大切になります。

また、カラムのデータ型についても最適化を図ってください。適切なデータ型を設定することはデータベース設計と運用について大変重要な要点です。テーブル数についての見直しが有効です。データ量が増えた場合はテーブルの分割も検討してみてください。

DELETEやUPDATEなどで肥大化したディスク領域を解消するには、OPTIMEZE TABLEで最適化を試みてください。大量のオーバーヘッドが発生している場合は、OPTIMEZE TABLEを実行することでデータ領域のフラグメントを解消できます。

まとめ

MySQLの最適化は常に考えなければならない工程のひとつです。データベースの運用では、アクセス頻度と時間の経過によってデータ量もアクセスコストも変動していきます。そのため、適切なチューニングや最適化が図られることで、より高いパフォーマンスを発揮できるのです。また、バージョンによってオプティマイザの仕様などが違うので、よく現状のデータベースを確認しながら対応してください。

CONTACT

製品・サービスに関するご質問、お見積もり、お問い合わせなど、お気軽にご連絡ください。

 050-5505-5509

受付時間 9:30 - 12:00, 13:00 - 17:00
(土日祝および年末年始を除く)