人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQL

以前にも質問したのですが、現在PHPを利用してスクリプトを作成中です。

その際にアクセスすると複数のSQLを実行する形なのですが、負荷を考慮してもうすこし改善したいと思っています。

現在の状況はデータを抜き取るSQL以外に引数から観覧許可か調べるSQLや同じように引数からレコードが存在するか調べるSQLなど、5つ以上のSQLを一度に実行する形です。

一度一つか二つにまとめれないか試したのですが、無理でした。

デベロッパーの皆さんはこのような問題をどのように解決しているのでしょうか?

●質問者: esecua
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:MySQL アクセス スクリプト デベロッパー データ
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● tamtam3
●8ポイント

DBの構造が、この説明ではよくわかりませんし

一体何をやりたいのかも よくわかりませんが

ただ、 根本的に 何かがオカシイ という事だけは分かりました

必要もないSQLを大量に組み込んでるのが 負荷の原因かと

とりあえず、下の本をお奨めします

リレーショナルデータベース入門―データモデル・SQL・管理システム (Information&Computing)


というのもかわいそうなので、一つだけ

引数から観覧許可か調べるSQL

これって、閲覧者がログインした時点で、従業員マスターか、顧客マスターかを見に行くだけで、何とかなりませんか?

毎回 毎回 見に行くのは 無駄だと思います。

で、1本減ったと


引数からレコードが存在するか調べるSQL

うーん・・・・※△○(略

◎質問者からの返答

うーんってなんですかw

明確にお願いしますね。(+お手柔らかに)


2 ● tadashi0805
●25ポイント

具体的なテーブル構造やクエリがないので外してるかもしれませんが、例えば、

・データを抜き取るSQL

・引数から観覧許可か調べるSQL

・引数からレコードが存在するか調べるSQL

が、もし同じ検索キーで検索しているのなら、とにかく1つ目の

・データを抜き取るSQL

だけを実行し、検索レコード数を返り値で見て0件なら3つ目の存在チェックも併せて行い、ヒットしたレコードの内容の、どこかのカラムに2つ目の観覧許可も得られるようにselect文で引っ張ってくるカラムを指定する、なんてことは考えます。

後は、各クエリを実行した時に、適切にインデックスが効いているのかどうかをEXPLAINコマンドで調査するのも、効果があるかもしれません。

http://dev.mysql.com/doc/refman/4.1/ja/explain.html

インデックスが効いてなくて全件検索が行われると、負荷が跳ね上がります。

◎質問者からの返答

この回答に内閣総理大臣賞を授与します。


3 ● un0
●6ポイント

負荷軽減が目的でしたら、

SQLを5回サーバー?クライアント間で往復させるよりは

ストアドプロシージャー、ストアドファンクションとする。

そうすると、クライアント側からは引数を1回渡すだけで

サーバーサイドで算出した上で必要な結果のみをクライアント側に返す。

という実装が可能になります。

◎質問者からの返答

>ストアドプロシージャー、ストアドファンクションとする


4 ● indiannotlies
●35ポイント

以下、当方の基本的なチューニングの手順です。

(もちろんデベロッパーによってやり方の違いはあるので、あくまで一例です)


1)ボトルネックの解析

DBの処理ログ等から負荷の高いSQL文を発行している箇所を見つけます。

今回は既に問題箇所が明らかになっているので必要ないかもしれませんが、例えば5つ以上のSQL文のうち、どれか一つだけが極端に負荷が高くなっている、という可能性もあります。

(実際の開発の現場ではここが最も時間がかかるところです)

2)SQL文の見直し

SQL文を特定したら、まずそのSQL文自体のチューニングを考えます。

ごく基本的なところでは、like演算子を不用意に使っていたためインデックスが利用されておらず検索効率が落ちていた、などがあます。

なおMysqlの場合、explain [SQL文] でそのSQLの効率性をある程度確認することが出来ます。


3)パラメータの見直し

DBやテーブルのパラメータを見直すことで、劇的に早くなる場合があります。

DBのメモリの割り当ての仕方や、テーブル項目の属性設定(可変長のデータを固定長にする、インデックスをつけ方を変える等)によりパフォーマンスの改善が期待できます。

またキャッシュを利用して高速化する他のミドルウェアを導入するのも一つの手です(自己でサーバを運用している場合に限りますが)。


4)テーブル構造の見直し

テーブル構造を見直し、多少正規性を崩してでも、頻繁にJoinされるデータ群を一つのテーブルにまとめる(あるいは新規にテーブルを作成する)などの方法で、アクセスの効率性を高めます。


5)処理ロジック、アルゴリズムの見直し

やろうとしていることの処理ロジックの設計自体を見直します。

例えば全データを毎回集計している部分を、差分のみの集計に変更するなどの工夫により、負荷を大幅に軽減できます(経験上、最もパフォーマンス向上に効くのはこちらです)。


以上がソフト面からの主なチューニングの方法(ストアドプロシージャはMysqlのバージョンにより制限されるので今回は除外)ですが、デベロッパーとしては他に負荷分散や、単純にサーバのメモリ増設、CPUの性能を上げる等のハード的な手法もとられます(手っ取り早いため)。


具体的なSQLが分からないため、一応チューニングの手順をご紹介しました。

まずはご参考まで。

◎質問者からの返答

星3つっ!


5 ● Yuhto
●36ポイント

RDBMSがMySQLであれば・・・

を検討します。

トランザクション処理が必要なければ、

InnoDBタイプからMyISAMタイプに変更するだけで

相当なパフォーマンス向上が見込めるはずです。


トランザクション処理がどうしても必要なのであれば、

とあるタイミングでMyISAMテーブルにデータの同期をとる処理を設け、

という役割を分けてあげることを検討するのもひとつの手段かと。


もともとMySQLは

  1. やすい:安価
  2. はやい:検索が高速
  3. うまい:フリーなのに高機能

が売りな気がします。

なので、

という問題がクリアされていれば、上記の手段が第一歩だと思います。


それでも・・・の場合には、

  1. SQLの見直し
  2. インデックスの有効活用

などなど、、に発展するとおもいます。


ちなみに、

引数からレコードが存在するか調べるSQL

の件ですが、

MySQLってOracleでいうEXISTS句が使えませんでしたっけ?

使えなければ、サブクエリ(副問い合わせ)で何とかなるかもしれませんよ。

◎質問者からの返答

めっちゃありがとうございます。星3つ。


1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ