使用するインデックスを明示する – MySQL インデックスヒントで最適化

 MySQLでクエリをExplainした時にpossible_keysに、IDX_IMPORT, IDX_FSEARCH, IDX_STAT等と複数の候補が存在してkeyにIDX_STATが選択されている時、実際にはIDX_IMPORTの方が高速だったり、他のインデックスよりIDX_STATが低速だったりする時、このインデックスを利用すると高速・低速であるというのをオプティマイザへ知らせる方法としてインデックスヒントがある。

インデックスヒントは

SELECT * FROM estimates USE INDEX(IDX_IMPORT, IDX_FSEARCH) WHERE total>=10000 AND type=1

のように、テーブルに対してUSE/IGNORE/FORCEにより指定する。

USE INDEXはその名の通り指定したインデックスを使用することを推奨するので、インデックス候補中で速い物を指定する。
FORCE INDEXはフルスキャンが非常に重いことを知らせた上で、指定したインデックスを使用することを推奨する。
※特定の条件ではインデックススキャンよりもフルスキャンの方が高速となるパターンがあるので、USEでインデックスを知らせてもそれを使用しないことがあるが、FORCE指定するとフルスキャンを回避してインデックスを使う様になる。 FORCE指定した場合、フルスキャンよりも低速になる可能性もあるので、実データで検証した上で指定した方が良い。
IGNORE INDEXは、逆に使用しないインデックスを指定するので、インデックス候補中で明らかに低速なインデックスがある場合にそれを除外するために使う。

USEとFORCEを比較

EXPLAIN SELECT id FROM estimates USE INDEX (PRIMARY) WHERE type=1 ORDER BY id

possible_keys:NULL key:NULL

EXPLAIN SELECT id FROM estimates FORCE INDEX (PRIMARY) WHERE type=1 ORDER BY id

possible_keys:NULL key:PRIMARY
 ちなみに、ヒントを与えない場合は、possible_keys:NULL key:NULLである。 このクエリを実際に発行すると、USEで0.25秒、FORCEで0.33秒と言うことで、インデックスを使っているけど逆に遅くなった。
 インデックスは何でも張って何でも使えばいいと言う物ではないと言うことだ。
 なお、このようにインデックスを使用すると遅くなる状況でオプティマイザがインデックスを使用するのを防ぐために、USE INDEX ()として、インデックスを使用しないことを明示することも出来る。

(22243)

カテゴリー: MySQL | コメントをどうぞ

さくらVPSでWindowsを利用していて再インストール無しに上位プランへ移行する

※この記事は古いです。 新しいバージョンの記事を参照してください。

 DTIのServersman@VPSだと、プランのアップグレードは管理画面操作で移行できて、特別な操作は不要だけど、さくらVPSの場合には新しいサーバとして契約して、環境は自分で引っ越し作業をしなければならない。
 Linuxでrsyncを使う方法が公式にあるけど、Windows化している場合には使えないので、独自に移行する方法を考えた。

まず、Windows版DDを入手する。
http://www.chrysocome.net/dd

 ローカルPCにPPTPサーバの設定を行う(Windows7ならば、スタート>コントロールパネル>ネットワークとインターネット>ネットワーク接続を開き、Altキーでメニューを出して、ファイル>新しい着信接続、ユーザを選んで次へ、インターネット接続をチェックして次へ、アクセスを許可をクリックするとPPTPの着信接続が出来る。 ルータでNAPTを使っている場合は、静的ルートでTCPポート1723とGREプロトコル(プロトコル番号47)をPPTPサーバにしたマシンに転送する様にする)
 VPS上のWindowsからPPTPダイアルアップ(新しい接続ウィザード>職場のネットワークへ接続する>仮想プライベートネットワーク接続>IPアドレスにPPTPサーバを設定したマシンのグローバルIPを設定し、それ以外は適当で作成。 このダイアルアップ接続を開いて、PPTPサーバのユーザとパスワードを入力して接続)して、VPSよりサイズの大きいドライブをマウントする。

dd if=\\?\Device\Harddisk0\Partition0 of=z:\sakura_windows.dd

 これで丸コピーしたら、新規導入時と同様、新しいVPSに踏み台Linux経由でdd書き込みしてやれば環境そのまま新サーバに移ることが出来る。 一応、イメージをgzかbz2で圧縮しておいたほうが速いかもしれない。
 ただし、イメージが大きくなっている場合には、踏み台の容量が足りなくなる。
 今回は980円プランから1480円プラン(空きディスクは/dev/sdbの10GBだけ)で足りなかったので、別のサーバにbz2圧縮したイメージを配置して

ssh -l user hoge.piyo “cat ~/sakura_windows.dd.bz2″|bzip2 -dc|dd of=/dev/sda

※userは接続先のユーザ名、hoge.piyoはサーバのアドレス(ヒナギク.com等)である。
みたいに、ssh経由で処理した。
 1980円プランなら/dev/sdbに30GBの空きがあるので、/dev/sdaの20GB全てを放り込んでも余裕がある。

 ちなみに、UNIX系OSで移動する場合には、ssh経由で、

ssh -l user hoge.piyo “dd if=/dev/sda | bzip2 -c”|bzip2 -dc|dd of=/dev/sda

 みたいにして、終始パイプで済ますのもあり。

 これだと、イメージが起動した状態なので、新VPSで起動するときにchkdskをかけてやる必要がある。
 セクタ単位で処理しているから、どこかで致命的なエラーが出るかもしれないが、基本的にはこれで動く。 Acronisのツールなどを入れてシャドウコピー併用でやればもう少し信頼性が上がるかもしれない。

(414)

カテゴリー: サーバ設定 | コメントをどうぞ

ネットワーク帯域制御 – CISCO ルーター

 CISCOルータを使って帯域制限を行う話。
 固定IPのプロバイダ契約して自宅にもサーバを構築してウェブアプリなどをデプロイしているのだけど、お客さんがいっぱい来ると、プロバイダに解約されたりしてしまう事がある。
 で、自宅のサーバ用に使っているCISCO1812Jルータでは、帯域制御を行うことが出来るので、これを使って対応する。
 通常のアクセス用には別のルータで構築してあるので、単純にこのCISCOの帯域を制限すればOK。
>en
#conf t
#policy-map shape
#class class-default
#shape peak 1024000
ctrl+z
#int FastEthernet0
#service-policy output shape

シェーピング(帯域制御)用にshapeと言う名前のポリシーマップを行う
ポリシーのクラスにはclass-default(全てのパケットに合致)を指定
ポリシーにピーク1Mbpsのシェーピングを指定する
PPPoEに使っているインターフェイスを指定して、帯域制限ポリシーを外向きにサービス登録している(PPPoEのリンクに設定しても動作しなかった)

 今回の外向きシェーピングは、単純な回線帯域制御の他、回線で絞っておくことでサーバの負荷を軽減する目的もある。

(1064)

カテゴリー: 未分類 | コメントをどうぞ

InnoDBを使うと一度増えた容量が減らない – MySQL

 MySQLでストレージエンジンにInnoDBを使うと、レコード削除しても実ファイルサイズが小さくならない。
 これはInnoDBの仕様で、MyISAMだと最適化するとファイルサイズが小さくなるんだけど、InnoDBはファイルサイズが小さくならない。
 なので、変換などの作業用などでInnoDBを使うとファイルサイズが膨らんじゃって、Dropしてもファイルサイズが大きいまんまって事が起きる。
 とりあえず、Dropしてやったときに小さくする方法としては、設定で
innodb_file_per_table=1
を指定してやる。
 通常時、MySQLはInnoDB用に唯一のファイルを作るのだが、それをやめてテーブル毎にファイルを作るようにする指定。
 これを指定すると、テーブルがDropされた時にファイルが消せるので、ディスクの消費を多少抑えられる。

 根本的に、テーブルの一部をDeleteした場合にファイルを小さくするには、テーブルをDumpしてDropしてファイルを削除して、Importすると言う手順が必要になる。
 テーブル毎にファイルが作成されていれば、この作業が楽になるので、Deleteが多く発生することが予想される場合には、先の設定を有効にしておけば、テーブル単位で作業が済むのでメンテナンス時間を短縮できる。

(2247)

カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

さくらVPSにWindowsServerを導入する

さくらVPSへのWindows導入方法の自分メモ
VMwareでVM(以下VMwin)を作る。 HDDはIDEで16GB位まで、CPUコアは2個で設定しておく。
VMwinを起動してWindowsServer(今回は2003R2)のメディアでブートして導入する。 導入後は、PRO 1000 MTのドライバをダウンロードしてVMwinのデスクトップに置いておく。 おまじないをしておく↓

  • 7010IDE.reg
  • Windows Registry Editor Version 5.00
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7010]
    “ClassGUID”=”{4D36E96A-E325-11CE-BFC1-08002BE10318}”
    “Service”=”intelide”

    これは、さくらVPSの仮想マシン環境のIDEコントローラがVEN8086&DEV7010の識別子のデバイスになっているが、VMwareは異なる識別子のデバイスを使っているので、いざVPSで起動しようとするとブートデバイスを見失ってブルースクリーンになるのを防ぐのに必要。 7010IDE.regファイルに保存して、VMwinで開いてレジストリ登録したらシャットダウンする。
    ※認証はVPSに乗せたあとに行う(ハードウェア構成が変わるから、そのままでは本番に乗せたあとに電話認証になってしまう)

    さくらのコントロールパネルから、カスタムOSインストールを選び、Debian 6 i386を導入する(以下VPStemp)
    パーティションの切り分けはマニュアルで、前方に非マウントExt3パーティションをVMwinのディスクサイズに合わせて切って、残りもExt3で/(root)マウントに設定してインストール。
    proftpd, vsftpd等のftpdを導入して動かしておいて、一時別作業。

    VMwareに作業用VM(VMLinux)を作る。 HDDサイズはSCSIモードで、容量は3GBもあれば事足りる。
    VMLinuxを起動して適当なLinuxディストリを導入してシャットダウンする。
    VM管理でVMLinuxにHDD追加を選択して、既存のイメージ(VMwinのディスク)をIDEで追加して起動する。
    fdisk -lコマンドでNTFSの場所を確認する(/dev/hda1になっているはず)
    /dev/hda1であれば、

    dd if=/dev/hda|gzip -c >winimg.gz

    で、HDDイメージを吸い出す(完了すればVMwinは不要)
    吸い出したイメージをftpでVPStempにアップロードする(こちらも完了すればVMLinuxは不要)

    VPStempでアップされたファイルをディスクに流し込む。

    gzip -dc <winimg.gz|dd of=/dev/sda

    ddが完了したらrebootする。

    WindowsServerが起動するので、VNCで入ってPRO1000MTドライバを導入、管理用リモートデスクトップの設定をしてやれば、あとはリモートデスクトップで快適に管理可能。
    (利用可能メモリ350MB程度確保できていたので、ちょっとしたasp.netアプリを動かすには十分そうだ)

    (634)

    カテゴリー: 未分類 | 1件のコメント

    さくらのVPSを併用してみた

     DTIのVPS 1980円コースは、グローバルIPが4個貰えるのが便利で使っているのだが、単純なパフォーマンス的にはさくらの980円コースの方が良いというのは色々な場所でのベンチ結果。
     そんなわけで、どうせならさくらの3980円コースあたり(保証メモリ4GB)に移行したい感じもあるんだけど、複数IPがほしいので併用しようかと思う。
     さくらを使うスペック面以外の理由が、裏技でWindowsサーバを導入出来ること(15GBくらいのパーティションにWindowsをインストールしてddで吸い出した物を用意して、VPSで前方に15GBくらいのブートパーティション、後方に小さなシステムパーティションを作ってLinuxを導入して、そのLinuxから先頭にddしてやると再起動後はddしたイメージのOSが起動できる)
     さくらVPSはKVMと言うシステムで完全仮想化しているので、基本的にどんなAT機用OSも動くんだけど、ServersMan@VPSはOpenVZと言うシステムで準仮想化(導入OS側にも仮想化の対応が必要)なので、自由なOS導入が出来ない。 と言うか、ServersMan@VPSの準仮想化では、NFSやSambaのようなOS機能に深く影響するサービスも動かない。
     WindowsServer2003位なら色々削ればIISを立てても980円コースで何とかなる(先日、2008R2に移行したため、2003のライセンスが浮いているので活用できる)
     IISが動けば、ホームサーバで公開していたASPアプリを移せるので、自宅の電気代が減るので何となく良い感じ。
     しかし、さくらのVPSの管理コンソールであるTightVNCはJP106キーボードでコンフィギュレーションされているので、英語キーボードしか持っていないと文字が化けまくってまともに操作できないのが難点(おとなしくJP106を買ってくるか、管理用リモートデスクトップを使えばOK) シリアルコンソールを使うとJP106の呪縛から解かれるので、最初のLinux操作はシリアルコンソールで済ませるのがおすすめ。

    (241)

    カテゴリー: 未分類 | コメントをどうぞ

    YouTube埋め込みタグを使用するとIEでnullエラーが発生する

     YouTubeの以前の埋め込みコードを有効にする(Objectタグ方式)で作ったタグをページに埋め込むと、IEでnullエラーが表示されることがある。
     このエラーは、Flash関連で処理されるJavascript(オートロードされるのでScriptタグには書かれていない)でgetElementByName(“”)と処理が行われて、戻り値がNullであるためにエラーが出ている。
     この探索エレメント名は、Objectタグのidが使用されるので、Objectタグにid属性を設定すれば良いのだが、適当な名前をつけると表示されなくなる。
     id属性の値はexternalとすると動画が表示されるようになり、nullエラーも回避される様になる。

    (523)

    カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ