こんにちは。
ミヤタと申します。
<okada.takayuki@pfu.fujitsu.com>From: Takayuki Okada
To: ml@mysql.gr.jp
Subject: [mysql 15008] 検索処理を早くするには?
Date: 2009/09/03 20:35
全件検索が非常に遅くなりました。
「全件検索」というのは、必ず全ての行をチェックするような処理という
事でしょうか(例えば select avg(col) from table; )。
これが必須という事であれば、全テーブルまたは索引がメモリに載るように
innodb_buffer_pool_size をかなり大きく保つ必要があります。
少ない件数からデータの追加と全件検索の実行で確認していけば、どの段階で
メモリとデータのバランスが崩れたのかが分かります。
※全テーブルと全索引を全件検索するようなSQLを1セットとして、最低、
それを2回実行する必要があります。1回目はメモリに載せる用、2回目は
メモリに載った状態での検索用。
explainで確認すると、一応、PKは使用しているようですが、
件数が多くなると、やはり遅くなります。
explainの結果とご説明をお願いします。
普通、「全件検索」にPKと索引は必要ありません。
「全件検索」に必要なカラムが索引に全て含まれる場合、テーブルのデータ
ではなく索引だけを使用してSQLを実行する事ができるので、その場合には
索引は有用です。
MySQLのPKはクラスターインデックスなので、例えば複合インデックスのPKで
全件検索は、テーブルデータ本体のカラムだけを指定した全件検索と変わり
ないかもしれません。
インデックスは条件句が複数となるため、
それごとに作成したくはないと思ってますので、
条件が複数であれば、それごとに要件を満たす索引が必要です。
下記のインデックス結合が要件を満たすのであれば、その限りではない場合も
ありますので確認してみて下さい。
http://dev.mysql.com/doc/refman/5.1/ja/index-merge-optimization.html
<okada.takayuki@pfu.fujitsu.com>From: Takayuki Okada
To: ml@mysql.gr.jp
Subject: [mysql 15012] Re: 検索処理を早くするには?
Date: 2009/09/06 17:14
本件ですが、発行されうるselectの条件句の上位6つほどの
インデックスを作成しましたが、この影響として、
登録&更新処理が非常に遅くなり、とても対策には使えませんでした。
どのような更新クエリがどの程度の頻度で実行され、どの位の更新時間が
どの位に遅くなったのかをお教え下さい。
CPUがすかすかなので、もっと並列で仕事をさせるような
ことはできないものでしょうか?
また、show statusの結果も、いたって、悪い箇所は見当たりません。
どの項目がどのように適切であると確認したのかを全てお教え下さい。
ちなみに、select文には副問い合わせもなく、とても
シンプルなものです。
件数が増えると、とても遅くなります。
件数とは、全データ件数ですか?走査件数ですか?検索結果件数ですか?
失礼ですが、現状の情報では何も伺っていないのと同じような状況です。
また岡田様がどの程度MySQLやデータベースに対して理解があるのかも
わからないため、まずは下記のような情報を出せるだけ出して頂くのが
良いと思います。
・サーバの構成(ハードウェア、OS(カーネル))
・my.cnf の内容
・SQL の内容(テーブル作成、索引作成、検索クエリ)
・explainの結果と説明
・データ件数
・サーバのメモリ使用状況
・my.cnf 設定の適切さをどのように確認したか(設定値とステータス)
・どのような情報をもとに、どのようなチューニングを行ったか