MySQL


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

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

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

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

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

回答の条件
  • 1人5回まで
  • 登録:2007/01/05 03:58:37
  • 終了:2007/01/09 01:52:59

回答(6件)

id:tamtam3 No.1

tamtam3回答回数345ベストアンサー獲得回数202007/01/05 05:58:42

ポイント8pt

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

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

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

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

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

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


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

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

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

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

で、1本減ったと


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

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

id:esecua

うーんってなんですかw

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

2007/01/05 07:52:28
id:tadashi0805 No.2

tadashi0805回答回数287ベストアンサー獲得回数292007/01/05 09:50:43

ポイント25pt

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

・データを抜き取るSQL

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

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

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

・データを抜き取るSQL

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

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

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

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

id:esecua

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

2007/01/05 13:50:43
id:un0 No.3

un0回答回数651ベストアンサー獲得回数322007/01/05 11:20:31

ポイント6pt

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

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

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

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

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

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

id:esecua

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

2007/01/05 23:48:34
id:indiannotlies No.4

indiannotlies回答回数3ベストアンサー獲得回数12007/01/05 11:33:27

ポイント35pt

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

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


1)ボトルネックの解析

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

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

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

  

2)SQL文の見直し

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

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

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


3)パラメータの見直し

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

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

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


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

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


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

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

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


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


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

まずはご参考まで。

id:esecua

星3つっ!

2007/01/05 13:47:47
id:Yuhto No.5

Yuhto回答回数19ベストアンサー獲得回数02007/01/05 11:47:15

ポイント36pt

RDBMSがMySQLであれば・・・

  • テーブルタイプをMyISAMにできないか?

を検討します。

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

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

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


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

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

  • 検索[R] →MyISAMテーブル
  • 更新[CRD]→InnoDBテーブル

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


もともとMySQLは

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

が売りな気がします。

なので、

  • SQLが相当複雑(もしくは改善の余地がある)
  • データ量がものすごい
  • 筐体(ハード)のスペックがひどい
  • ネットワークトラフィックがひどい

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


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

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

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


ちなみに、

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

の件ですが、

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

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

id:esecua

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

2007/01/05 23:49:30
id:buffalo1975 No.6

buffalo1975回答回数1ベストアンサー獲得回数02007/01/05 18:05:35

うんこですね

id:esecua

しまった。。。。こんな回答とは思わずオープンしてしまった。

しかもこのひとこれを言うためにID作っているて言うのがうけるw

2007/01/05 23:46:49
  • id:b-wind
    DBチューニングに王道はなく、それぞれのケースで試行錯誤しながら対処を行う事が多い。
    もうちょっと詳細な情報がないと有益な情報は得にくいと思いますよ?

    テーブル構造と実行しているSQLがあればそれなりに回答のしようもあるのですが。
  • id:tamtam3
    社内システムなのか、社外システムなのか
    スピード重視なのか、安全性重視なのか
    メンテナンスしやすいのか、スピード命なのか
    DBの構造そのものを弄れるのか、触れないのか
    そもそも、MySQLのバージョンはなんなのか
    鯖のスペックはどの程度のものなのか・・・etc

    で、無限に答えがでてくるシロモノだもんだし
    世の中には、天才がいるから、ひょっとしたら 
    5本同時にSQL走らすほうが 単独で走らすより効率的に・・・

    ・・ないない(笑 
  • id:esecua
    >b-wind様
    次回からは明確な文で質問したいと思います。
    ありがとうございました。

    >tamtam3様
    回答ありがとうございます。「5本同時にSQL走らすほうが 単独で走らすより効率的に・・・」にとありますが、単体とはどういう意味なのでしょうか。もしよろしければお願いします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません