<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:content="http://purl.org/rss/1.0/modules/content/">

<channel>
  <title>Planet MySQL</title>
  <link>http://www.planetmysql.org/</link>
  <pubDate>Mon, 23 Nov 2009 07:15:02 +0000</pubDate>
  <language>jp</language>
  <description>Planet MySQL - http://www.planetmysql.org/</description>

  <item>
    <title>Firebirdユーザコンテキスト変数を使ったdense_rank()</title>
    <guid isPermaLink="false">http://blog.kimuradb.com/?eid=821756</guid>
    <link>http://blog.kimuradb.com/?eid=821756</link>
    <description>以前MySQLユーザ変数を使ったdense_rank()を紹介しましたが、
下記はそのFirebird版です。

Firebirdではrdb&amp;#36;set_context()が値ではなく、既存の設定あり(1), なし(0)になってしまうので、
Firebirdの組み込み関数に追加されたdecode()(Oracleと同じ)で、値を返すようにしています。

QL&amp;gt; --Like dense_rank()
SQL&amp;gt; select rdb&amp;#36;set_context('USER_SESSION', 'rnk', 0), rdb&amp;#36;set_context('USER_SESSION', 'preval', null) from rdb&amp;#36;database;

RDB&amp;#36;SET_CONTEXT RDB&amp;#36;SET_CONTEXT
=============== ===============
              0               0

SQL&amp;gt; select case  when cast(rdb&amp;#36;get_context('USER_SESSION', 'preval') as int) &amp;lt;&amp;gt; sal then cast(rdb&amp;#36;get_context('USER_SESSION', 'rnk') as int)
CON&amp;gt; ELSE decode(rdb&amp;#36;set_context('USER_SESSION', 'rnk', cast(rdb&amp;#36;get_context('USER_SESSION', 'rnk') as int) + 1),1,cast(rdb&amp;#36;get_context('USER_SESSION', 'rnk') as int)) END,
CON&amp;gt; decode(cast(rdb&amp;#36;set_context('USER_SESSION', 'preval', sal) as int), 1, sal,sal) from emp order by sal;

        CASE         CASE
============ ============
           1          800
           2          950
           3         1100
           4         1250
           5         1250
           6         1300
           7         1500
           8         1600
           9         2450
          10         2850
          11         2975
          12         3000
          13         3000
          14         5000</description>
    <content:encoded><![CDATA[以前<a href="http://blog.kimuradb.com/?eid=681082" target="_blank">MySQLユーザ変数を使ったdense_rank()</a>を紹介しましたが、<br />
下記はそのFirebird版です。<br />
<br />
Firebirdではrdb&#36;set_context()が値ではなく、既存の設定あり(1), なし(0)になってしまうので、<br />
Firebirdの組み込み関数に追加されたdecode()(Oracleと同じ)で、値を返すようにしています。<br />
<br />
QL&gt; --Like dense_rank()<br />
SQL&gt; select rdb&#36;set_context('USER_SESSION', 'rnk', 0), rdb&#36;set_context('USER_SESSION', 'preval', null) from rdb&#36;database;<br />
<br />
RDB&#36;SET_CONTEXT RDB&#36;SET_CONTEXT<br />
=============== ===============<br />
              0               0<br />
<br />
SQL&gt; select case  when cast(rdb&#36;get_context('USER_SESSION', 'preval') as int) &lt;&gt; sal then cast(rdb&#36;get_context('USER_SESSION', 'rnk') as int)<br />
CON&gt; ELSE decode(rdb&#36;set_context('USER_SESSION', 'rnk', cast(rdb&#36;get_context('USER_SESSION', 'rnk') as int) + 1),1,cast(rdb&#36;get_context('USER_SESSION', 'rnk') as int)) END,<br />
CON&gt; decode(cast(rdb&#36;set_context('USER_SESSION', 'preval', sal) as int), 1, sal,sal) from emp order by sal;<br />
<br />
        CASE         CASE<br />
============ ============<br />
           1          800<br />
           2          950<br />
           3         1100<br />
           4         1250<br />
           5         1250<br />
           6         1300<br />
           7         1500<br />
           8         1600<br />
           9         2450<br />
          10         2850<br />
          11         2975<br />
          12         3000<br />
          13         3000<br />
          14         5000<br /><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22349&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22349&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Mon, 23 Nov 2009 03:08:08 +0000</pubDate>
    <dc:creator>MeijiK</dc:creator>
    <category>Firebird/InterBase</category>
  </item>

  <item>
    <title>[mysql]MySQL 5.0.88リリース−EoLにちゅうい-</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20091121/p1</guid>
    <link>http://d.hatena.ne.jp/sakaik/20091121/p1</link>
    <description>　5.0.99 まであと11！　とドキドキしている今日この頃。みなさんいかがお過ごしでしょうか。 　MySQL 5.0.88 がリリースされました。さすがに修正項目も少ないですね。 　http://www.mysql.gr.jp/frame/modules/news/article.php?storyid=157  　さて、各メジャーバージョンごとにだいたい月１回のペースで新しいバージョンが公開されているのですが、いよいよ、この MySQL 5.0 シリーズも EoL(End of Life) です。 ...</description>
    <content:encoded><![CDATA[　5.0.99 まであと11！　とドキドキしている今日この頃。みなさんいかがお過ごしでしょうか。 　MySQL 5.0.88 がリリースされました。さすがに修正項目も少ないですね。 　http://www.mysql.gr.jp/frame/modules/news/article.php?storyid=157  　さて、各メジャーバージョンごとにだいたい月１回のペースで新しいバージョンが公開されているのですが、いよいよ、この MySQL 5.0 シリーズも EoL(End of Life) です。 ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22338&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22338&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Sat, 21 Nov 2009 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>MySQL 5.1.41リリース</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sh2/20091120</guid>
    <link>http://d.hatena.ne.jp/sh2/20091120</link>
    <description>出ました。今回は機能の追加・変更が4件、バグ修正が62件あります。 MySQL 5.1.38から同梱されるようになったInnoDB Pluginですが、MySQL 5.1.41ではバージョンが1.0.5に上がり、ついにRC(リリース候補版)となりました。再掲になりますがInnoDB PluginはビルトインのInnoDBに比べて以下のような機能強化が施されており、非常に有用性の高いものです。そろそろ利用を検討しても良い時期に入ってきたのではないかと思います。  高速なインデックス作成。従来InnoDBのCREATE INDEXはテーブルの再作成を伴っていました テーブルとインデックスの圧縮 (検証結果その1、その2) INFORMATION_SCHEMAによるロック競合の検出 (検証結果) CPUスケーラビリティの向上 (1.0.3から) バックグラウンドI/Oスレッドの増加 (1.0.4から。検証結果) グループコミットの修正 (1.0.4から。Sun松信氏による検証結果)  InnoDB Plugin 1.0.5ではバッファプールの管理アルゴリズムが強化されました。今回はこの点について、他の製品と比較しながら理解していきたいと思います。 InnoDBのバッファプール管理 ほとんどのRDBMSは、ディスク上に保存されたテーブルのデータをメモリ上にキャッシュする仕組みを備えています。テーブルのデータをメモリ上にキャッシュする目的は、頻繁にアクセスされるデータについてアクセスのたびにディスクI/Oが発生することを防ぎ、全体の性能を向上させることです。InnoDBではこの領域のことをバッファプールと呼び、通常1GBから、多い場合は8GB程度を割り当てて利用しています。 すべてのデータがメモリ上に収まってしまえば悩むことはないのですが、多くの場合メモリのサイズはデータベースサイズよりも小さいため、すべてのデータを収めるわけにはいきません。そのため、よく使われるデータというものをより分けてメモリに蓄える必要があります。これにはLRUアルゴリズムが用いられます。バッファプールのそれぞれのページをリストとして連結し、ページがアクセスされるたびに対象のページをリストの先頭(MRU側、Most Recently Used)に移動させます。しばらくアクセスされなかったページはリストの末尾(LRU側、Least Recently Used)に寄せられていき、バッファプールの容量を超えたものはメモリから破棄されるというアルゴリズムです。 LRUリストは仕組みが明快で有効性も高いのですが、弱点があります。それは、1回しかアクセスされない巨大なデータが来た場合に、本来蓄えておくべきアクセス頻度の高いデータが巨大なデータによって押し流されてしまうという点です。そのため各RDBMS製品はLRUリストに工夫を加えることでこれに対処しています。  これはInnoDBのバッファプールをLRUの観点から図示したものです。見てすぐ分かるようにLRUリストが2本あります。1本はYoung LRUリスト、もう1本はOld LRUリストと呼ばれているものです。  ディスクから読み込まれたデータは、まずOld LRUリストのMRU側に配置されます。 Old LRUリスト上のデータがもう一度アクセスされると、Young LRUリストの先頭に移動されます。 Young LRUリストからあふれたデータはOld LRUリストのMRU側に戻されます。 Old LRUリストからあふれたデータはメモリ上から破棄されます。  ディスクから読み込んだデータがLRUリスト全体に対するMRU側ではなく中間地点に挿入されることから、このアルゴリズムのことをミッドポイント挿入戦略と呼びます。この戦略によって、1回しかアクセスされないデータが他の重要なデータを押し流してしまうことを防ごうとしています。 しかし、これまでこのミッドポイント挿入戦略はうまく機能していませんでした。InnoDBのページは16KBあって1ページ内に複数のレコードが格納されているのですが、テーブルのフルスキャンを行う際に例えば1ページに2レコードが格納されていると、それだけでアクセス回数が2回と数えられてしまうためです。そのため結局のところ1回のフルスキャンによって他のデータが押し流されてしまうということが発生してしまっていました。 InnoDB Plugin 1.0.5ではinnodb_old_blocks_timeという新規パラメータによってこの問題に対処できるようになりました。このパラメータを設定すると、Old LRUリストに格納されたページに対して再びアクセスが発生しても、指定した時間が経過するまではYoung LRUリストに移動されないようになります。innodb_old_blocks_timeはミリ秒単位で指定し、デフォルトは0(無効)となっています。 MyISAMのキーキャッシュ管理 他の製品ではどうなっているのか、まず近いところでMyISAMのアルゴリズムを見てみましょう。MyISAMの特徴としてテーブルのデータはキャッシュせず、インデックスのデータのみをキーキャッシュという領域に格納するという点があります。テーブルのデータはOSのキャッシュ機構にまかせてしまう、というのがMyISAMの設計思想です。  MyISAMのキーキャッシュも、InnoDBと同様に2本のLRUリストで管理されています。それぞれHot LRUリスト、Warm LRUリストという名前がついていて、役割はInnoDBのYoung LRUリスト、Old LRUリストとまったく同じです。 InnoDBはYoung LRUリストへの昇格を時間で管理していましたが、MyISAMはHot LRUリストへの昇格を回数で管理しています。Warm LRUリストにあるブロックは、Warm LRUリストから脱落するまでに3回アクセスされるとHot LRUリストに移動されるという仕組みになっています。 また、Hot LRUリストから脱落したブロックは、Warm LRUリストのMRU側ではなくLRU側に配置されます。Hot LRUリストから脱落した時点で、それはもう不要なデータだと判断されていることになります。 Oracleのデータベースバッファキャッシュ管理 続いてOracle Databaseのバッファキャッシュ管理アルゴリズムを確認していきましょう。  OracleのLRUリストは内部的にホットバッファとコールドバッファという二つの領域に分けられています。これはInnoDBにおけるYoung LRUリスト、Old LRUリストとほぼ同じものですが、二つの領域のサイズ比をOracleが自動で調節するようになっているところが異なります。また、OracleはLRUリストを用途別に複数持っています。 Oracleのバッファキャッシュ管理におけるポイントは、データへのアクセスパターンによってLRUリストの挿入位置を変化させているところにあります。 まず、インデックスアクセスによりディスクのランダムリードを行った場合は、InnoDBやMyISAMと同様に読み込んだデータブロックをホットバッファとコールドバッファの境目にあるコールドポインタという位置に挿入します。またLRUリスト内のデータブロックはそれぞれがアクセスカウンタを持っており、一定回数アクセスされたデータブロックはコールドバッファからホットバッファに移されます。このあたりの考え方はMyISAMと同じです。 一方、テーブルフルスキャンによりディスクのシーケンシャルリードを行った場合は、読み込んだデータブロックはLRUリストのLRU側に挿入されます。そのためフルスキャンによって読み込んだデータは、次の瞬間には破棄されてしまうということになります。これはつまりdb_block_size×db_file_multiblock_read_count分のメモリを本当にただのバッファとして利用しているだけで、データを再利用できるように保持するつもりがまったくないということです。この仕組みによって、アクセス頻度の高いデータがバッファキャッシュから押し流されてしまうことを防いでいます。 ただし、いくつかの条件の下ではテーブルフルスキャンを行ったデータでもコールドポインタに挿入することがあります。  インスタンス起動直後でバッファキャッシュに未使用領域がある場合 アクセス対象のテーブルがバッファキャッシュのサイズに比べて十分小さい場合 SQLにCACHEヒント句をつけた場合(SELECT /*+ CACHE(emp) */ ename FROM emp;)  こうした仕組みによって、Oracleではどのデータをメモリ上に保持しておくのかがきめ細かく制御されています。 さらに、特定のテーブルがメモリ上から押し出されないようにするために、Oracleはバッファキャッシュを分割して管理する機能を備えています。  このようにOracleではデフォルトのバッファプールに加えてKEEPバッファプール、RECYCLEバッファプールという2種類の領域を定義し、それぞれにメモリを割り当てることができるようになっています。KEEPバッファプールにはメモリ上に保持しておきたいデータ、RECYCLEバッファプールにはメモリ上に保持する必要性の薄いデータを配置します。この配置はテーブル単位で行われ、図のようにALTER TABLE文を用いて事前に配置先を指定しておく必要があります。何も指定していないテーブルはデフォルトのバッファプールに配置されることになります。全体として、限られたメモリを有効活用するために手厚いサポートがされていることが分かると思います。 2本目のLRUリストにはLRUWリストという名前がついていますが、これはYoung LRUリスト、Old LRUリストと対比するための一つの例として記載したもので、実際にはOracleのLRUリストはさまざまな用途に応じたものが合計10種類あります。 LRUWリストはメモリ上で更新されたデータブロックが格納されるもので、このLRUWリスト上に存在するデータブロックはDBWRプロセスによってそのうちディスクに書き戻されることが決まっています。このように更新されたデータブロックを通常のLRUリストから分離しておくと、チェックポイント時にDBWRがスキャンしなければならないメモリ量を減らすことができるため、性能が良くなるというわけです。この考え方はLinuxカーネル 2.6.28で導入されたSplit LRUと似ていると思います。 性能向上の観点からもう一つ、OracleのLRUリストはこの10種類を1セットとして複数セットが用意されており、バッファキャッシュを内部的に分割して管理しています。なぜ分割されているかというと、LRUリストはその構造上リストを更新するために排他ロックを取らなければならず、リストが一組しかないとCPU数の増加に応じた性能を発揮しにくいためです。このセット数はCPU数やメモリサイズに応じてOracleが内部的に決めるもので、私の手元のPCでも32セットというかなり大量のLRUリストが用意されています。これがすべてではありませんが、Oracleはこうした作りによって高いCPUスケーラビリティを確保しています。 Oracleに近づくInnoDB InnoDB Pluginはバージョンアップごとにかなりアグレッシブな機能強化が行われていて、徐々にではありますがアーキテクチャがOracleに近づいてきているように思います。このエントリだけ読むとまだOracleとの機能差はかなりあると感じるかもしれませんが、実際の利用シーンでは微々たる差になりつつあります。Oracle一筋というエンジニアの方も、そろそろMySQLを触ってみてもよい頃合いかもしれませんね。</description>
    <content:encoded><![CDATA[出ました。今回は機能の追加・変更が4件、バグ修正が62件あります。 <span>MySQL</span> 5.1.38から同梱されるようになったInnoDB Pluginですが、<span>MySQL</span> 5.1.41ではバージョンが1.0.5に上がり、ついにRC(リリース候補版)となりました。再掲になりますがInnoDB PluginはビルトインのInnoDBに比べて以下のような機能強化が施されており、非常に有用性の高いものです。そろそろ利用を検討しても良い時期に入ってきたのではないかと思います。  高速なインデックス作成。従来InnoDBのCREATE INDEXはテーブルの再作成を伴っていました テーブルとインデックスの圧縮 (検証結果その1、その2) INFORMATION_SCHEMAによるロック競合の検出 (検証結果) CPUスケーラビリティの向上 (1.0.3から) バックグラウンドI/Oスレッドの増加 (1.0.4から。検証結果) グループコミットの修正 (1.0.4から。Sun松信氏による検証結果)  InnoDB Plugin 1.0.5ではバッファプールの管理アルゴリズムが強化されました。今回はこの点について、他の製品と比較しながら理解していきたいと思います。 InnoDBのバッファプール管理 ほとんどのRDBMSは、ディスク上に保存されたテーブルのデータをメモリ上にキャッシュする仕組みを備えています。テーブルのデータをメモリ上にキャッシュする目的は、頻繁にアクセスされるデータについてアクセスのたびにディスクI/Oが発生することを防ぎ、全体の性能を向上させることです。InnoDBではこの領域のことをバッファプールと呼び、通常1GBから、多い場合は8GB程度を割り当てて利用しています。 すべてのデータがメモリ上に収まってしまえば悩むことはないのですが、多くの場合メモリのサイズはデータベースサイズよりも小さいため、すべてのデータを収めるわけにはいきません。そのため、よく使われるデータというものをより分けてメモリに蓄える必要があります。これにはLRUアルゴリズムが用いられます。バッファプールのそれぞれのページをリストとして連結し、ページがアクセスされるたびに対象のページをリストの先頭(MRU側、Most Recently Used)に移動させます。しばらくアクセスされなかったページはリストの末尾(LRU側、Least Recently Used)に寄せられていき、バッファプールの容量を超えたものはメモリから破棄されるというアルゴリズムです。 LRUリストは仕組みが明快で有効性も高いのですが、弱点があります。それは、1回しかアクセスされない巨大なデータが来た場合に、本来蓄えておくべきアクセス頻度の高いデータが巨大なデータによって押し流されてしまうという点です。そのため各RDBMS製品はLRUリストに工夫を加えることでこれに対処しています。  これはInnoDBのバッファプールをLRUの観点から図示したものです。見てすぐ分かるようにLRUリストが2本あります。1本はYoung LRUリスト、もう1本はOld LRUリストと呼ばれているものです。  ディスクから読み込まれたデータは、まずOld LRUリストのMRU側に配置されます。 Old LRUリスト上のデータがもう一度アクセスされると、Young LRUリストの先頭に移動されます。 Young LRUリストからあふれたデータはOld LRUリストのMRU側に戻されます。 Old LRUリストからあふれたデータはメモリ上から破棄されます。  ディスクから読み込んだデータがLRUリスト全体に対するMRU側ではなく中間地点に挿入されることから、このアルゴリズムのことをミッドポイント挿入戦略と呼びます。この戦略によって、1回しかアクセスされないデータが他の重要なデータを押し流してしまうことを防ごうとしています。 しかし、これまでこのミッドポイント挿入戦略はうまく機能していませんでした。InnoDBのページは16KBあって1ページ内に複数のレコードが格納されているのですが、テーブルのフルスキャンを行う際に例えば1ページに2レコードが格納されていると、それだけでアクセス回数が2回と数えられてしまうためです。そのため結局のところ1回のフルスキャンによって他のデータが押し流されてしまうということが発生してしまっていました。 InnoDB Plugin 1.0.5ではinnodb_old_blocks_timeという新規パラメータによってこの問題に対処できるようになりました。このパラメータを設定すると、Old LRUリストに格納されたページに対して再びアクセスが発生しても、指定した時間が経過するまではYoung LRUリストに移動されないようになります。innodb_old_blocks_timeはミリ秒単位で指定し、デフォルトは0(無効)となっています。 MyISAMのキーキャッシュ管理 他の製品ではどうなっているのか、まず近いところでMyISAMのアルゴリズムを見てみましょう。MyISAMの特徴としてテーブルのデータはキャッシュせず、インデックスのデータのみをキーキャッシュという領域に格納するという点があります。テーブルのデータはOSのキャッシュ機構にまかせてしまう、というのがMyISAMの設計思想です。  MyISAMのキーキャッシュも、InnoDBと同様に2本のLRUリストで管理されています。それぞれHot LRUリスト、Warm LRUリストという名前がついていて、役割はInnoDBのYoung LRUリスト、Old LRUリストとまったく同じです。 InnoDBはYoung LRUリストへの昇格を時間で管理していましたが、MyISAMはHot LRUリストへの昇格を回数で管理しています。Warm LRUリストにあるブロックは、Warm LRUリストから脱落するまでに3回アクセスされるとHot LRUリストに移動されるという仕組みになっています。 また、Hot LRUリストから脱落したブロックは、Warm LRUリストのMRU側ではなくLRU側に配置されます。Hot LRUリストから脱落した時点で、それはもう不要なデータだと判断されていることになります。 Oracleのデータベースバッファキャッシュ管理 続いてOracle Databaseのバッファキャッシュ管理アルゴリズムを確認していきましょう。  OracleのLRUリストは内部的にホットバッファとコールドバッファという二つの領域に分けられています。これはInnoDBにおけるYoung LRUリスト、Old LRUリストとほぼ同じものですが、二つの領域のサイズ比をOracleが自動で調節するようになっているところが異なります。また、OracleはLRUリストを用途別に複数持っています。 Oracleのバッファキャッシュ管理におけるポイントは、データへのアクセスパターンによってLRUリストの挿入位置を変化させているところにあります。 まず、インデックスアクセスによりディスクのランダムリードを行った場合は、InnoDBやMyISAMと同様に読み込んだデータブロックをホットバッファとコールドバッファの境目にあるコールドポインタという位置に挿入します。またLRUリスト内のデータブロックはそれぞれがアクセスカウンタを持っており、一定回数アクセスされたデータブロックはコールドバッファからホットバッファに移されます。このあたりの考え方はMyISAMと同じです。 一方、テーブルフルスキャンによりディスクのシーケンシャルリードを行った場合は、読み込んだデータブロックはLRUリストのLRU側に挿入されます。そのためフルスキャンによって読み込んだデータは、次の瞬間には破棄されてしまうということになります。これはつまりdb_block_size×db_file_multiblock_read_count分のメモリを本当にただのバッファとして利用しているだけで、データを再利用できるように保持するつもりがまったくないということです。この仕組みによって、アクセス頻度の高いデータがバッファキャッシュから押し流されてしまうことを防いでいます。 ただし、いくつかの条件の下ではテーブルフルスキャンを行ったデータでもコールドポインタに挿入することがあります。  インスタンス起動直後でバッファキャッシュに未使用領域がある場合 アクセス対象のテーブルがバッファキャッシュのサイズに比べて十分小さい場合 SQLにCACHEヒント句をつけた場合(SELECT /*+ CACHE(emp) */ ename FROM emp;)  こうした仕組みによって、Oracleではどのデータをメモリ上に保持しておくのかがきめ細かく制御されています。 さらに、特定のテーブルがメモリ上から押し出されないようにするために、Oracleはバッファキャッシュを分割して管理する機能を備えています。  このようにOracleではデフォルトのバッファプールに加えてKEEPバッファプール、RECYCLEバッファプールという2種類の領域を定義し、それぞれにメモリを割り当てることができるようになっています。KEEPバッファプールにはメモリ上に保持しておきたいデータ、RECYCLEバッファプールにはメモリ上に保持する必要性の薄いデータを配置します。この配置はテーブル単位で行われ、図のようにALTER TABLE文を用いて事前に配置先を指定しておく必要があります。何も指定していないテーブルはデフォルトのバッファプールに配置されることになります。全体として、限られたメモリを有効活用するために手厚いサポートがされていることが分かると思います。 2本目のLRUリストにはLRUWリストという名前がついていますが、これはYoung LRUリスト、Old LRUリストと対比するための一つの例として記載したもので、実際にはOracleのLRUリストはさまざまな用途に応じたものが合計10種類あります。 LRUWリストはメモリ上で更新されたデータブロックが格納されるもので、このLRUWリスト上に存在するデータブロックはDBWRプロセスによってそのうちディスクに書き戻されることが決まっています。このように更新されたデータブロックを通常のLRUリストから分離しておくと、チェックポイント時にDBWRがスキャンしなければならないメモリ量を減らすことができるため、性能が良くなるというわけです。この考え方はLinuxカーネル 2.6.28で導入されたSplit LRUと似ていると思います。 性能向上の観点からもう一つ、OracleのLRUリストはこの10種類を1セットとして複数セットが用意されており、バッファキャッシュを内部的に分割して管理しています。なぜ分割されているかというと、LRUリストはその構造上リストを更新するために排他ロックを取らなければならず、リストが一組しかないとCPU数の増加に応じた性能を発揮しにくいためです。このセット数はCPU数やメモリサイズに応じてOracleが内部的に決めるもので、私の手元のPCでも32セットというかなり大量のLRUリストが用意されています。これがすべてではありませんが、Oracleはこうした作りによって高いCPUスケーラビリティを確保しています。 Oracleに近づくInnoDB InnoDB Pluginはバージョンアップごとにかなりアグレッシブな機能強化が行われていて、徐々にではありますがアーキテクチャがOracleに近づいてきているように思います。このエントリだけ読むとまだOracleとの機能差はかなりあると感じるかもしれませんが、実際の利用シーンでは微々たる差になりつつあります。Oracle一筋というエンジニアの方も、そろそろ<span>MySQL</span>を触ってみてもよい頃合いかもしれませんね。<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22316&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22316&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Fri, 20 Nov 2009 00:00:00 +0000</pubDate>
    <dc:creator>Sadao Hiratsuka</dc:creator>
  </item>

  <item>
    <title>[misc][mysql]インタビュー記事が okyuu.com に掲載されました</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20091120/okyuu_int</guid>
    <link>http://d.hatena.ne.jp/sakaik/20091120/okyuu_int</link>
    <description>　カカクコム社の運営する okyuu.com からインタビューをしていただきました。昨日公開。   http://okyuu.com/ja/special/engineer10-sakai  「すごいITエンジニア」にインタビューしていく企画で、私より前に出てきている方々は誰もが知っているような方たちばかり（もし知らない人がいたら業界的にモグリですよ！情報収集しましょう(笑)）。　直前数人を遡るだけでも、MySQLの第一人者サンの松信さん、drizzleで有名な(っていうかdrizzle自体がまだ有名 ...</description>
    <content:encoded><![CDATA[　カカクコム社の運営する okyuu.com からインタビューをしていただきました。昨日公開。   http://okyuu.com/ja/special/engineer10-sakai  「すごいITエンジニア」にインタビューしていく企画で、私より前に出てきている方々は誰もが知っているような方たちばかり（もし知らない人がいたら業界的にモグリですよ！情報収集しましょう(笑)）。　直前数人を遡るだけでも、MySQLの第一人者サンの松信さん、drizzleで有名な(っていうかdrizzle自体がまだ有名 ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22320&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22320&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Fri, 20 Nov 2009 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>WebDB Forum 2009 初日のポスターレセプションに参加しました。</title>
    <guid isPermaLink="false">http://blog.kimuradb.com/?eid=821492</guid>
    <link>http://blog.kimuradb.com/?eid=821492</link>
    <description>一昨年から参加しているWebDB Forum。今年は場所を慶應大学日吉キャンパスに移し開催しています。

WebDB Forum 2009

今回私はFirebird日本ユーザー会の一員として、会員のはやしさんとともにポスターレセプションに参加してきました。まぁポスターレセプションといっても、ポスターを用意して、バイキング形式＆飲み放題の酒を飲みつつ、勝手に二時間過ごすというものです(ざっくりすぎる説明....)

学生の研究、企業のPR、そして我々のようなコミュニティも参加して、まぁバラエティに富んでいます。

サイボウズラボもブースを出していて、MySQL関連で有名な奥さん、LL関連で有名な竹迫さんもいらしていて、しばしご歓談。Q4Mはしっていたけど、mycachedは知らなかったなぁ。

各種研究はまぁ地味なものも多かったけど、留学生の方のひたむきな瞳と、説明はいつ聞いても新鮮です。ええ、私がおじさんになった証拠でもあります。ははは。</description>
    <content:encoded><![CDATA[一昨年から参加しているWebDB Forum。今年は場所を慶應大学日吉キャンパスに移し開催しています。<br />
<br />
<a href="http://db-event.jpn.org/webdbf2009/" target="_blank">WebDB Forum 2009</a><br />
<br />
今回私は<a href="http://firebird.gr.jp" target="_blank">Firebird日本ユーザー会</a>の一員として、会員のはやしさんとともにポスターレセプションに参加してきました。まぁポスターレセプションといっても、ポスターを用意して、バイキング形式＆飲み放題の酒を飲みつつ、勝手に二時間過ごすというものです(ざっくりすぎる説明....)<br />
<br />
学生の研究、企業のPR、そして我々のようなコミュニティも参加して、まぁバラエティに富んでいます。<br />
<br />
<a href="http://labs.cybozu.co.jp/" target="_blank">サイボウズラボ</a>もブースを出していて、<a href="http://d.hatena.ne.jp/kazuhooku/" target="_blank">MySQL関連で有名な奥さん</a>、<a href="http://developer.cybozu.co.jp/takesako/" target="_blank">LL関連で有名な竹迫さん</a>もいらしていて、しばしご歓談。<a href="http://labs.cybozu.co.jp/blog/kazuho/archives/2008/01/q4m.php" target="_blank">Q4M</a>はしっていたけど、<a href="http://developer.cybozu.co.jp/kazuho/2009/08/mycached-memcac.html" target="_blank">mycachedは知らなかったなぁ</a>。<br />
<br />
各種研究はまぁ地味なものも多かったけど、留学生の方のひたむきな瞳と、説明はいつ聞いても新鮮です。ええ、私がおじさんになった証拠でもあります。ははは。<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22340&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22340&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Thu, 19 Nov 2009 14:20:16 +0000</pubDate>
    <dc:creator>MeijiK</dc:creator>
    <category>データベース</category>
  </item>

  <item>
    <title>[mysql]MySQL 5.1.41 リリース</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20091119/p1</guid>
    <link>http://d.hatena.ne.jp/sakaik/20091119/p1</link>
    <description>　定刻通り、今回もほぼ１ヶ月ぶりに MySQL 5.1 シリーズの最新版が公開されました。本当にここ最近（今年に入ってから？）、各メジャーバージョンのリリーススケジュールのコントロールが素晴らしいですね。  　ということで今回出たのは MySQL 5.1.41。 　http://www.mysql.gr.jp/frame/modules/news/article.php?storyid=156  　なんと言っても目玉は「InnoDB Plugin が 1.0.5-RC になった！」ということでしょう。 ...</description>
    <content:encoded><![CDATA[　定刻通り、今回もほぼ１ヶ月ぶりに MySQL 5.1 シリーズの最新版が公開されました。本当にここ最近（今年に入ってから？）、各メジャーバージョンのリリーススケジュールのコントロールが素晴らしいですね。  　ということで今回出たのは MySQL 5.1.41。 　http://www.mysql.gr.jp/frame/modules/news/article.php?storyid=156  　なんと言っても目玉は「InnoDB Plugin が 1.0.5-RC になった！」ということでしょう。 ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22309&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22309&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Thu, 19 Nov 2009 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>[mysql]MySQL 5.1 英語／日本語マニュアル最新差分</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20091117/mysql_manual_compare</guid>
    <link>http://d.hatena.ne.jp/sakaik/20091117/mysql_manual_compare</link>
    <description>　MySQL 5.1 マニュアルには日本語版があります。 http://dev.mysql.com/doc/refman/5.1/ja/  しかしこの日本語版、5.1.15-beta の頃 *1 に日本語化したもので、その後多少の修正は加えられ続けているものの、英語版マニュアル(http://dev.mysql.com/doc/refman/5.1/en/)のダイナミックな変更には追随していないものなのです。   　ということで、MySQL 5.1 マニュアル。 現時点の最新英語版と 現在公開されてい ...</description>
    <content:encoded><![CDATA[　MySQL 5.1 マニュアルには日本語版があります。 http://dev.mysql.com/doc/refman/5.1/ja/  しかしこの日本語版、5.1.15-beta の頃 *1 に日本語化したもので、その後多少の修正は加えられ続けているものの、英語版マニュアル(http://dev.mysql.com/doc/refman/5.1/en/)のダイナミックな変更には追随していないものなのです。   　ということで、MySQL 5.1 マニュアル。 現時点の最新英語版と 現在公開されてい ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22284&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22284&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Tue, 17 Nov 2009 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>[Tritonn] Tritonn 1.0.12 - MySQL 5.0.87へのアップデートリリース</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/mir/20091116/p1</guid>
    <link>http://d.hatena.ne.jp/mir/20091116/p1</link>
    <description>
			早いもので前回のリリースから1年弱が経過してしまいましたが、SourceForgeのダウンロード統計を見ているとリリースが無い間も継続的にダウンロードしてくださる方々がいらっしゃるのが気になっていました。
			そこで現在のMySQL 5.0系の最新版である5.0.87向けのソース配布版およびold-styleパッチをリリースしました！
			https://sourceforge.jp/projects/tritonn/releases/
			今回のリリースはMySQL 5.0系最新版へのアップデートが目的です。Tritonn自体のバージョンは1.0.12のままです。
			Tritonnの1.0.13については担当者多忙につき少しお休み中。MySQL 5.1対応についてはGroongaストレージエンジンを開発中です。
			バイナリパッケージについては時間が取れ次第、随時リリースして行きます。
		</description>
    <content:encoded><![CDATA[<div>
			<p>早いもので前回のリリースから1年弱が経過してしまいましたが、SourceForgeのダウンロード統計を見ているとリリースが無い間も継続的にダウンロードしてくださる方々がいらっしゃるのが気になっていました。</p>
			<p>そこで現在のMySQL 5.0系の最新版である5.0.87向けのソース配布版およびold-styleパッチをリリースしました！</p>
			<p><a href="https://sourceforge.jp/projects/tritonn/releases/" target="_blank">https://sourceforge.jp/projects/tritonn/releases/</a></p>
			<p>今回のリリースはMySQL 5.0系最新版へのアップデートが目的です。Tritonn自体のバージョンは1.0.12のままです。</p>
			<p>Tritonnの1.0.13については担当者多忙につき少しお休み中。MySQL 5.1対応についてはGroongaストレージエンジンを開発中です。</p>
			<p>バイナリパッケージについては時間が取れ次第、随時リリースして行きます。</p>
		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22267&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22267&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Mon, 16 Nov 2009 00:00:00 +0000</pubDate>
    <dc:creator>Tetsuro Ikeda</dc:creator>
  </item>

  <item>
    <title>OSC2009高知</title>
    <guid isPermaLink="false">http://blog.kimuradb.com/?eid=819911</guid>
    <link>http://blog.kimuradb.com/?eid=819911</link>
    <description>
四国で初めての開催になるOSC高知に参加してきました。

私は愛媛出身ですが、高知にくるのは多分二回目(一回目は子供のころなのでまったく覚えていない)本当は前日に移動する予定が、遅れて当日朝の移動になりました。四国の他の三県は比較的、山が少なく平野が多いのですが、高知は山が多くて飛行機から見た景色は圧巻でした。

さすがに四国開催ということで、参加者人数は少なめ、参加者は控えめだったのですが、初回開催としては成功だったと思います。

私は今期のネタMySQL Workbenchをやりましたが、同じネタをやっても地方により受けたり受けなかったりするのが不思議です(いつも)

ライトニングトークとその後の打ち上げで、高知大学の菊池先生(今回の世話役の方)のお人柄に触れて、ほのぼのとした気持ちになったOSC高知でした。</description>
    <content:encoded><![CDATA[<img src="http://blog.kimuradb.com/images/moblog_586311.JPG" class="pict" alt="" width="640" height="480" /><br />
四国で初めての開催になるOSC高知に参加してきました。<br />
<br />
私は愛媛出身ですが、高知にくるのは多分二回目(一回目は子供のころなのでまったく覚えていない)本当は前日に移動する予定が、遅れて当日朝の移動になりました。四国の他の三県は比較的、山が少なく平野が多いのですが、高知は山が多くて飛行機から見た景色は圧巻でした。<br />
<br />
さすがに四国開催ということで、参加者人数は少なめ、参加者は控えめだったのですが、初回開催としては成功だったと思います。<br />
<br />
私は今期のネタMySQL Workbenchをやりましたが、同じネタをやっても地方により受けたり受けなかったりするのが不思議です(いつも)<br />
<br />
ライトニングトークとその後の打ち上げで、高知大学の菊池先生(今回の世話役の方)のお人柄に触れて、ほのぼのとした気持ちになったOSC高知でした。<br /><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22261&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22261&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Sat, 14 Nov 2009 14:40:45 +0000</pubDate>
    <dc:creator>MeijiK</dc:creator>
    <category>オープンソース</category>
  </item>

  <item>
    <title>四国で初めてのOSC2009高知開催</title>
    <guid isPermaLink="false">http://blog.kimuradb.com/?eid=819576</guid>
    <link>http://blog.kimuradb.com/?eid=819576</link>
    <description>

MySQLのマスコットSakilaも待ちかねた？
四国で初めてのOSCであるOSC2009Kochiが明日(2009-11-14(Sat))開催です。

私はMyNAのブースと、セミナーを一つやりますので、お近くの方は是非ご参加ください。
</description>
    <content:encoded><![CDATA[<img src="http://blog.kimuradb.com/images/moblog_585885.JPG" class="pict" alt="" width="640" height="480" /><br />
<br />
MySQLのマスコットSakilaも待ちかねた？<br />
<a href="http://www.ospn.jp/osc2009-kochi/" target="_blank">四国で初めてのOSCであるOSC2009Kochiが明日(2009-11-14(Sat))開催</a>です。<br />
<br />
私は<a href="http://www.mysql.gr.jp/" target="_blank">MyNAのブース</a>と、<a href="http://www.ospn.jp/osc2009-kochi/modules/eguide/event.php?eid=12" target="_blank">セミナーを一つ</a>やりますので、お近くの方は是非ご参加ください。<br />
<br /><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22240&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22240&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Thu, 12 Nov 2009 22:13:56 +0000</pubDate>
    <dc:creator>MeijiK</dc:creator>
    <category>オープンソース</category>
  </item>

  <item>
    <title>[mysql] 実録、ほぼ無停止なMySQLのフェイルオーバ (動画もあるよ)</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/hirose31/20091111/1257942168</guid>
    <link>http://d.hatena.ne.jp/hirose31/20091111/1257942168</link>
    <description>
			レプリケーションしてるMySQLで、マスタやスレーブが障害停止した場合のリカバリプラン でも掲げたゴールである、「マスタが落ちてもぐーすか寝ていられるようにしたい」がほぼできたので、ほとんどサービスが停止することなく、フェイルオーバする様をスクリーンキャストに収めました。
			埋め込みプレイヤーだと、小さくてわからないと思うので、リンク直接でみてください。
			
http://www.irori.org/pub/mysql-mm.mov

			 登場するホスト
			登場するホストは2台、db901とdb902です。
			最初は、db901が更新系クエリを受けるプライマリでdb900の浮動IPアドレスを持っています。
			 画面分割
			画面は5分割しています。
			
				 左上 = 「select sysdate(),@@server_id」をdb900に対して(sleep 1しながら)延々と実行しまくりんぐ
				 右上 = ping -n db900
				 右下の2つ = 上のが ping -n db901、下のが ping -n db902
				 左下 = db901を落とそうと待ち構えているターミナル
			
			 動画の解説
			
				00&amp;#58;00
				はじまりはじまり。db900に対するselect、db900,db901,db902に対するping、すべて正常に流れている。selectのserver_idは、db901のものである「901」が返ってきているのを覚えておいてください。
				00&amp;#58;11
				この時点でのプライマリでもあるdb901を強制終了する。強制終了には SysRq を使ってバルスっと落とす (# echo b &amp;#62; /proc/sysrq-trigger)
				00&amp;#58;12
				db901が停止したので、db901に対するpingがとまる。db901はdb900でもあったので、db900に対するpingとdb900に対するselectも止まる。
				00&amp;#58;17
				首尾よくフェイルオーバが完了し、db902がdb900となったので、db900に対するpingとdb900に対するselectが回復(server_idが「901」から「902」に変わっている点に注目！)した。yay!
			

			 フェイルオーバのメカニズム
			今回のケースでは、停止から 5 秒後には、
			
				 異常の検知
				 プライマリのフェイルオーバ
			
			が完了しています。
			フェイルオーバのメカニズムは、レプリケーションしてるMySQLで、マスタやスレーブが障害停止した場合のリカバリプラン の 「&amp;#60;セカンダリをプライマリに昇格&amp;#62;」に書いた通りなんですが、監視とこのフェイルオーバ処理の実装は、
			
				 keepalived --vrrp
				 MySQLのL7レベルの監視をするスクリプト (check-service.db)
				 状態変更時にもろもろの処理をするスクリプト (trigger-vrrp.db)
				
					 keepalived.confのnotifyや、check-service.db から実行される
				
				
			
			で行ってます。
			 あとがき
			これでお正月は安心しておもちがたべられそうです ＾ρ＾
		</description>
    <content:encoded><![CDATA[<div>
			<p><a href="http://d.hatena.ne.jp/hirose31/20091023/1256259405" target="_blank">レプリケーションしてるMySQLで、マスタやスレーブが障害停止した場合のリカバリプラン</a> でも掲げたゴールである、「マスタが落ちてもぐーすか寝ていられるようにしたい」がほぼできたので、ほとんどサービスが停止することなく、フェイルオーバする様をスクリーンキャストに収めました。</p>
			<p>埋め込みプレイヤーだと、小さくてわからないと思うので、リンク直接でみてください。</p>
			<p><div></div>
<a href="http://www.irori.org/pub/mysql-mm.mov" alt="">http://www.irori.org/pub/mysql-mm.mov</a>
</p>
			<h4> 登場するホスト</h4>
			<p>登場するホストは2台、db901とdb902です。</p>
			<p>最初は、db901が更新系クエリを受けるプライマリでdb900の浮動IPアドレスを持っています。</p>
			<h4> 画面分割</h4>
			<p>画面は5分割しています。</p>
			<ul>
				<li> 左上 = 「select sysdate(),@@server_id」をdb900に対して(sleep 1しながら)延々と実行しまくりんぐ</li>
				<li> 右上 = ping -n db900</li>
				<li> 右下の2つ = 上のが ping -n db901、下のが ping -n db902</li>
				<li> 左下 = db901を落とそうと待ち構えているターミナル</li>
			</ul>
			<h4> 動画の解説</h4>
			<dl>
				<dt>00&#58;00</dt>
				<dd>はじまりはじまり。db900に対するselect、db900,db901,db902に対するping、すべて正常に流れている。selectのserver_idは、db901のものである「901」が返ってきているのを覚えておいてください。</dd>
				<dt>00&#58;11</dt>
				<dd>この時点でのプライマリでもあるdb901を強制終了する。強制終了には SysRq を使ってバルスっと落とす (# echo b &#62; /proc/sysrq-trigger)</dd>
				<dt>00&#58;12</dt>
				<dd>db901が停止したので、db901に対するpingがとまる。db901はdb900でもあったので、db900に対するpingとdb900に対するselectも止まる。</dd>
				<dt>00&#58;17</dt>
				<dd>首尾よくフェイルオーバが完了し、db902がdb900となったので、db900に対するpingとdb900に対するselectが回復(server_idが「901」から「902」に変わっている点に注目！)した。yay!</dd>
			</dl>

			<h4> フェイルオーバのメカニズム</h4>
			<p>今回のケースでは、停止から 5 秒後には、</p>
			<ul>
				<li> 異常の検知</li>
				<li> プライマリのフェイルオーバ</li>
			</ul>
			<p>が完了しています。</p>
			<p>フェイルオーバのメカニズムは、<a href="http://d.hatena.ne.jp/hirose31/20091023/1256259405" target="_blank">レプリケーションしてるMySQLで、マスタやスレーブが障害停止した場合のリカバリプラン</a> の 「&#60;セカンダリをプライマリに昇格&#62;」に書いた通りなんですが、監視とこのフェイルオーバ処理の実装は、</p>
			<ul>
				<li> keepalived --vrrp</li>
				<li> MySQLのL7レベルの監視をするスクリプト (check-service.db)</li>
				<li> 状態変更時にもろもろの処理をするスクリプト (trigger-vrrp.db)
				<ul>
					<li> keepalived.confのnotifyや、check-service.db から実行される</li>
				</ul>
				</li>
			</ul>
			<p>で行ってます。</p>
			<h4> あとがき</h4>
			<p>これでお正月は安心しておもちがたべられそうです ＾ρ＾</p>
		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22208&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22208&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Wed, 11 Nov 2009 12:22:48 +0000</pubDate>
    <dc:creator>ひろせ まさあき</dc:creator>
  </item>

  <item>
    <title>Strawberry PerlにDBD::mysqlインストール</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/kazuhooku/20091111/1257920902</guid>
    <link>http://d.hatena.ne.jp/kazuhooku/20091111/1257920902</link>
    <description>
			
				 dev.mysql.com から MSI 形式のインストーラをダウンロード
				 開発用ヘッダやライブラリも含めて、mysql をインストール
				 mysql の scripts\mysql_config.pl を bin\ にコピー
				 管理者権限で cmd.exe を起動して cpan, force install DBD::mysql
			

		</description>
    <content:encoded><![CDATA[<div>
			<ol>
				<li> dev.mysql.com から MSI 形式のインストーラをダウンロード</li>
				<li> 開発用ヘッダやライブラリも含めて、mysql をインストール</li>
				<li> mysql の scripts\mysql_config.pl を bin\ にコピー</li>
				<li> 管理者権限で cmd.exe を起動して cpan, force install DBD::mysql</li>
			</ol>

		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22201&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22201&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Wed, 11 Nov 2009 06:28:22 +0000</pubDate>
    <dc:creator>Kazuho Oku</dc:creator>
  </item>

  <item>
    <title>[MySQL]相互情報量(mutual information)についてのメモ3</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/rin1024/20091110/1257822798</guid>
    <link>http://d.hatena.ne.jp/rin1024/20091110/1257822798</link>
    <description>
			色々試してみてたら，
			共起語の各共起回数が少ない場合に相互情報量を使うのは
			一つの手段としてアリなのかもとか思った．
			

			
			例1:相互情報量のが意味がありそうな結果
			

			

			
			例2：どっちもまぁまぁ
			

			
			例3:共起語のが良い結果
		</description>
    <content:encoded><![CDATA[<div>
			<p>色々試してみてたら，</p>
			<p>共起語の各共起回数が少ない場合に相互情報量を使うのは</p>
			<p>一つの手段としてアリなのかもとか思った．</p>
			<br>

			<p><a href="http://f.hatena.ne.jp/rin1024/20091110121252" target="_blank"><img src="http://f.hatena.ne.jp/images/fotolife/r/rin1024/20091110/20091110121252.gif" alt="f:id:rin1024:20091110121252g:image" title="f:id:rin1024:20091110121252g:image" /></a></p>
			<p>例1:相互情報量のが意味がありそうな結果</p>
			<br>

			<br>

			<p><a href="http://f.hatena.ne.jp/rin1024/20091110121254" target="_blank"><img src="http://f.hatena.ne.jp/images/fotolife/r/rin1024/20091110/20091110121254.gif" alt="f:id:rin1024:20091110121254g:image" title="f:id:rin1024:20091110121254g:image" /></a></p>
			<p>例2：どっちもまぁまぁ</p>
			<br>

			<p><a href="http://f.hatena.ne.jp/rin1024/20091110121639" target="_blank"><img src="http://f.hatena.ne.jp/images/fotolife/r/rin1024/20091110/20091110121639.gif" alt="f:id:rin1024:20091110121639g:image" title="f:id:rin1024:20091110121639g:image" /></a></p>
			<p>例3:共起語のが良い結果</p>
		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22164&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22164&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Tue, 10 Nov 2009 03:13:18 +0000</pubDate>
    <dc:creator>Yuki Anai</dc:creator>
  </item>

  <item>
    <title>[MySQL]相互情報量(mutual information)についてのメモ2</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/rin1024/20091109/1257777582</guid>
    <link>http://d.hatena.ne.jp/rin1024/20091109/1257777582</link>
    <description>
			テスト結果をつらつら書いてると長くなりそうなので記事を分けた．
			

			情報量にidf値を用いてやってみた．
			単語Aが出たら単語Bも出るっていう確率は分子で行っているので，
			分母はidfってゆー，対極的重み付けのスコアを使ってみる．

相互情報量 = log(
  (全文書に出現した単語の総数 * 単語Aと単語Bの共起頻度)
   / 
  (単語Aのidf値 * 単語Bのidf値)
)

			

			発行したSQLは以下の通り．

select
  t1.id,
  t1.name,
  t2.id,
  t2.name,
  log(
    -- T1
    (
      -- 語の総数
      (select count(id) from terms as t_cnt)
      *
      -- AとBの共起回数
      (
        select
          count(term_id) as co_cnt
        from document_terms a
        join terms b
          on a.term_id = b.id
        where
          document_id in (
            select document_id from document_terms where term_id = t1.id
          ) 
          and term_id != t1.id
          and term_id = t2.id
        group by term_id
        order by co_cnt desc
        limit 1
      )
    )
    /
    -- T2
    (
      -- Aの情報量(idf)
      t1.idf
      *
      -- Bの情報量(idf)
      t2.idf
    )
  ) as mutual_information
from
  terms t1
join
  terms t2
  on t2.id != t1.id
where
  t1.id = 12198
  and
  t1.idf &amp;#62; 2
  and
  t2.idf &amp;#62; 2
-- group by
--  t1.id
having
  mutual_information is not null
order by
  mutual_information desc
limit
  30
;


			

			
			試してみたら微妙な結果に！
			(海女さん...)
			

			因みによかったケース：
			「ACIDMAN」というバンド名を対象にテスト
			

			
			共起情報の場合．
			まあ割と納得．
			

			
			「アーティスト」や「ライブ」という共起情報のテーブルには無かったのが出てる！！
			

			「アーティスト」「ライブ」「ACIDMAN」は一つのグループにしても納得は得られると思う．
			

			ただ，これの欠点はノイズが多い．
			非常に多い．
			これを解決するにはノイズになりそうな単語を除くとか必要になりそうですね．
			

			メモ１：
			ストップワードを反映した後にまた試してみる(多分)
		</description>
    <content:encoded><![CDATA[<div>
			<p>テスト結果をつらつら書いてると長くなりそうなので記事を分けた．</p>
			<br>

			<p>情報量にidf値を用いてやってみた．</p>
			<p>単語Aが出たら単語Bも出るっていう確率は分子で行っているので，</p>
			<p>分母はidfってゆー，対極的重み付けのスコアを使ってみる．</p>
<p><pre>
相互情報量 = log(
  (全文書に出現した単語の総数 * 単語Aと単語Bの共起頻度)
   / 
  (単語Aのidf値 * 単語Bのidf値)
)
</pre></p>
			<br>

			<p>発行したSQLは以下の通り．</p>
<pre>
<span>select</span>
  t1.id,
  t1.name,
  t2.id,
  t2.name,
  log(
    <span>-- T1</span>
    (
      <span>-- 語の総数</span>
      (<span>select</span> count(id) <span>from</span> terms <span>as</span> t_cnt)
      *
      <span>-- AとBの共起回数</span>
      (
        <span>select</span>
          count(term_id) <span>as</span> co_cnt
        <span>from</span> document_terms a
        join terms b
          <span>on</span> a.term_id = b.id
        <span>where</span>
          document_id <span>in</span> (
            <span>select</span> document_id <span>from</span> document_terms <span>where</span> term_id = t1.id
          ) 
          <span>and</span> term_id != t1.id
          <span>and</span> term_id = t2.id
        <span>group</span> <span>by</span> term_id
        <span>order</span> <span>by</span> co_cnt <span>desc</span>
        limit <span>1</span>
      )
    )
    /
    <span>-- T2</span>
    (
      <span>-- Aの情報量(idf)</span>
      t1.idf
      *
      <span>-- Bの情報量(idf)</span>
      t2.idf
    )
  ) <span>as</span> mutual_information
<span>from</span>
  terms t1
join
  terms t2
  <span>on</span> t2.id != t1.id
<span>where</span>
  t1.id = <span>12198</span>
  <span>and</span>
  t1.idf &#62; <span>2</span>
  <span>and</span>
  t2.idf &#62; <span>2</span>
<span>-- group by</span>
<span>--  t1.id</span>
<span>having</span>
  mutual_information <span>is</span> <span>not</span> <span>null</span>
<span>order</span> <span>by</span>
  mutual_information <span>desc</span>
limit
  <span>30</span>
;
</pre>

			<br>

			<p><a href="http://f.hatena.ne.jp/rin1024/20091109232910" target="_blank"><img src="http://f.hatena.ne.jp/images/fotolife/r/rin1024/20091109/20091109232910.jpg" alt="f:id:rin1024:20091109232910j:image" title="f:id:rin1024:20091109232910j:image" /></a></p>
			<p>試してみたら微妙な結果に！</p>
			<p>(海女さん...)</p>
			<br>

			<p>因みによかったケース：</p>
			<p>「ACIDMAN」というバンド名を対象にテスト</p>
			<br>

			<p><a href="http://f.hatena.ne.jp/rin1024/20091109234253" target="_blank"><img src="http://f.hatena.ne.jp/images/fotolife/r/rin1024/20091109/20091109234253.jpg" alt="f:id:rin1024:20091109234253j:image" title="f:id:rin1024:20091109234253j:image" /></a></p>
			<p>共起情報の場合．</p>
			<p>まあ割と納得．</p>
			<br>

			<p><a href="http://f.hatena.ne.jp/rin1024/20091109234255" target="_blank"><img src="http://f.hatena.ne.jp/images/fotolife/r/rin1024/20091109/20091109234255.jpg" alt="f:id:rin1024:20091109234255j:image" title="f:id:rin1024:20091109234255j:image" /></a></p>
			<p>「アーティスト」や「ライブ」という共起情報のテーブルには無かったのが出てる！！</p>
			<br>

			<p>「<i>アーティスト</i>」「<i>ライブ</i>」「<i>ACIDMAN</i>」は一つのグループにしても納得は得られると思う．</p>
			<br>

			<p>ただ，これの欠点はノイズが多い．</p>
			<p>非常に多い．</p>
			<p>これを解決するにはノイズになりそうな単語を除くとか必要になりそうですね．</p>
			<br>

			<p>メモ１：</p>
			<p>ストップワードを反映した後にまた試してみる(多分)</p>
		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22157&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22157&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Mon, 09 Nov 2009 14:39:42 +0000</pubDate>
    <dc:creator>Yuki Anai</dc:creator>
  </item>

  <item>
    <title>[MySQL]相互情報量(mutual information)についてのメモ</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/rin1024/20091109/1257745590</guid>
    <link>http://d.hatena.ne.jp/rin1024/20091109/1257745590</link>
    <description>
			推薦の勉強の一環のメモです。
			

			相互情報量とは、単語Aが出たら単語Bも文書Xに出るという
			情報量の計算に使えそうな理論。
			これをクラスタリングする際の指標に使えないかと模索中です。
			

			数式は下記の通り。
			
			

			数Aとか数Bが超苦手だったので、
			解釈があっているのかアレなのですが、
			この式をこんな風に解釈できるんじゃないかと考えてみました。
			(正しい数式じゃないのでご注意ください)
			


相互情報量 = log(
  (全文書に出現した単語の総数 * 単語Aと単語Bの共起頻度) / (単語Aの出現頻度 * 単語Bの出現頻度)
)

			

			多分色々間違ってるような気もするけど。
			で、作ったのが以下のSQL。

insert into term_matual_infos(
select
  t1.id,
  t2.id,
  log(
    -- T1
    (
      -- 語の総数
      (select count(id) from terms)
      *
      -- AとBの共起頻度
      (
        select
          -- term_id,
          -- b.name,
          count(term_id) / (select count(id) from documents) as co_cnt
        from document_terms a
        join terms b
          on a.term_id = b.id
        where
          document_id in (
            select document_id from document_terms where term_id = t1.id
          )   
          and term_id != t1.id
          and term_id = t2.id
        group by term_id order by co_cnt desc
        limit 1
      )   
    )   
    /   
    -- T2
    (   
      -- Aの出現頻度
      (   
        select
          (select count(term_id) from document_terms where term_id = t1.id)
          /
          (select count(id) from documents)
      )       
      *   
      -- Bの出現頻度
      (
        select
          (select count(term_id) from document_terms where term_id = t2.id)
          /
          (select count(id) from documents)
      )
    )
  ) as mutual_information
from
  terms t1
join
  terms t2
  on t2.id != t1.id
where
  t1.idf &amp;#62; 2
  and
  t2.idf &amp;#62; 2
);


			

			テーブルの定義は以下の通り。

-- 文書テーブル
CREATE TABLE `documents` (
  `id` int(11) NOT NULL auto_increment,
  `title` text,
  `document` longtext,
  `n` float default NULL COMMENT '文書正規化用(コサイン正規化)',
  PRIMARY KEY  (`id`)
);


-- 文書中に出現した単語を保存するテーブル
CREATE TABLE `document_terms` (
  `document_id` int(11) NOT NULL,
  `term_id` int(11) NOT NULL,
  `frequency` int(11) default NULL COMMENT '出現回数',
  `tf` float default NULL,
  `score` float default NULL COMMENT 'TF-IDFのスコア',
  PRIMARY KEY  (`document_id`,`term_id`)
);


-- 単語テーブル
CREATE TABLE `terms` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  `idf` float default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `name` (`name`)
);


-- 単語同士の情報量保存テーブル
create table term_matual_infos(
  term_id int not null,
  tar_term_id int not null,
  score float not null
);


			

			
			こんな感じ。
			

			「海女」が対象の単語で，
			1段落目が共起情報から抽出した単語リストで，
			2段目が相互情報量を用いて抽出した単語リスト．
			「海女」に「就職」が出てるのは，
			最近美女が海女さんになった(就職)ってニュースから来てる様子．
			(参考URL：http://www.youtube.com/watch?v=nlbSpQqCV9E)
			

			メモ１：
			このリストは気付きには使えるかもしれないけど，
			似ている単語としてクラスタリングするのには使えないと思った．
			

			メモ２：
			情報量の定義を色々変えてみて後でまた試したい．
			出現頻度の値域を0〜1にするとまた変わるのかなー．
		</description>
    <content:encoded><![CDATA[<div>
			<p>推薦の勉強の一環のメモです。</p>
			<br>

			<p>相互情報量とは、単語Aが出たら単語Bも文書Xに出るという</p>
			<p>情報量の計算に使えそうな理論。</p>
			<p>これをクラスタリングする際の指標に使えないかと模索中です。</p>
			<br>

			<p>数式は下記の通り。</p>
			<p><img src="http://upload.wikimedia.org/math/5/1/1/511ea3d5e0ccf0c15376c0935e23d5b1.png" /></p>
			<br>

			<p>数Aとか数Bが超苦手だったので、</p>
			<p>解釈があっているのかアレなのですが、</p>
			<p>この式をこんな風に解釈できるんじゃないかと考えてみました。</p>
			<p>(<span>正しい数式じゃないのでご注意ください</span>)</p>
			<br>

<p><pre>
相互情報量 = log(
  (全文書に出現した単語の総数 * 単語Aと単語Bの共起頻度) / (単語Aの出現頻度 * 単語Bの出現頻度)
)
</pre></p>
			<br>

			<p>多分色々間違ってるような気もするけど。</p>
			<p>で、作ったのが以下のSQL。</p>
<pre>
<span>insert</span> <span>into</span> term_matual_infos(
<span>select</span>
  t1.id,
  t2.id,
  log(
    <span>-- T1</span>
    (
      <span>-- 語の総数</span>
      (<span>select</span> count(id) <span>from</span> terms)
      *
      <span>-- AとBの共起頻度</span>
      (
        <span>select</span>
          <span>-- term_id,</span>
          <span>-- b.name,</span>
          count(term_id) / (<span>select</span> count(id) <span>from</span> documents) <span>as</span> co_cnt
        <span>from</span> document_terms a
        join terms b
          <span>on</span> a.term_id = b.id
        <span>where</span>
          document_id <span>in</span> (
            <span>select</span> document_id <span>from</span> document_terms <span>where</span> term_id = t1.id
          )   
          <span>and</span> term_id != t1.id
          <span>and</span> term_id = t2.id
        <span>group</span> <span>by</span> term_id <span>order</span> <span>by</span> co_cnt <span>desc</span>
        limit <span>1</span>
      )   
    )   
    /   
    <span>-- T2</span>
    (   
      <span>-- Aの出現頻度</span>
      (   
        <span>select</span>
          (<span>select</span> count(term_id) <span>from</span> document_terms <span>where</span> term_id = t1.id)
          /
          (<span>select</span> count(id) <span>from</span> documents)
      )       
      *   
      <span>-- Bの出現頻度</span>
      (
        <span>select</span>
          (<span>select</span> count(term_id) <span>from</span> document_terms <span>where</span> term_id = t2.id)
          /
          (<span>select</span> count(id) <span>from</span> documents)
      )
    )
  ) <span>as</span> mutual_information
<span>from</span>
  terms t1
join
  terms t2
  <span>on</span> t2.id != t1.id
<span>where</span>
  t1.idf &#62; <span>2</span>
  <span>and</span>
  t2.idf &#62; <span>2</span>
);
</pre>

			<br>

			<p>テーブルの定義は以下の通り。</p>
<pre>
<span>-- 文書テーブル</span>
<span>CREATE</span> <span>TABLE</span> `documents` (
  `id` int(<span>11</span>) <span>NOT</span> <span>NULL</span> auto_increment,
  `title` text,
  `document` longtext,
  `n` <span>float</span> <span>default</span> <span>NULL</span> <span>COMMENT</span> <span>'文書正規化用(コサイン正規化)'</span>,
  PRIMARY KEY  (`id`)
);


<span>-- 文書中に出現した単語を保存するテーブル</span>
<span>CREATE</span> <span>TABLE</span> `document_terms` (
  `document_id` int(<span>11</span>) <span>NOT</span> <span>NULL</span>,
  `term_id` int(<span>11</span>) <span>NOT</span> <span>NULL</span>,
  `frequency` int(<span>11</span>) <span>default</span> <span>NULL</span> <span>COMMENT</span> <span>'出現回数'</span>,
  `tf` <span>float</span> <span>default</span> <span>NULL</span>,
  `score` <span>float</span> <span>default</span> <span>NULL</span> <span>COMMENT</span> <span>'TF-IDFのスコア'</span>,
  PRIMARY KEY  (`document_id`,`term_id`)
);


<span>-- 単語テーブル</span>
<span>CREATE</span> <span>TABLE</span> `terms` (
  `id` int(<span>11</span>) <span>NOT</span> <span>NULL</span> auto_increment,
  `name` <span>varchar</span>(<span>50</span>) <span>NOT</span> <span>NULL</span>,
  `idf` <span>float</span> <span>default</span> <span>NULL</span>,
  PRIMARY KEY  (`id`),
  <span>UNIQUE</span> KEY `name` (`name`)
);


<span>-- 単語同士の情報量保存テーブル</span>
<span>create</span> <span>table</span> term_matual_infos(
  term_id int <span>not</span> <span>null</span>,
  tar_term_id int <span>not</span> <span>null</span>,
  score <span>float</span> <span>not</span> <span>null</span>
);
</pre>

			<br>

			<p><a href="http://f.hatena.ne.jp/rin1024/20091109200047" target="_blank"><img src="http://f.hatena.ne.jp/images/fotolife/r/rin1024/20091109/20091109200047.jpg" alt="f:id:rin1024:20091109200047j:image" title="f:id:rin1024:20091109200047j:image" /></a></p>
			<p>こんな感じ。</p>
			<br>

			<p>「海女」が対象の単語で，</p>
			<p>1段落目が共起情報から抽出した単語リストで，</p>
			<p>2段目が相互情報量を用いて抽出した単語リスト．</p>
			<p>「海女」に「就職」が出てるのは，</p>
			<p>最近美女が海女さんになった(就職)ってニュースから来てる様子．</p>
			<p>(参考URL：<a href="http://www.youtube.com/watch?v=nlbSpQqCV9E" target="_blank">http://www.youtube.com/watch?v=nlbSpQqCV9E</a>)</p>
			<br>

			<p>メモ１：</p>
			<p>このリストは気付きには使えるかもしれないけど，</p>
			<p>似ている単語としてクラスタリングするのには使えないと思った．</p>
			<br>

			<p>メモ２：</p>
			<p>情報量の定義を色々変えてみて後でまた試したい．</p>
			<p>出現頻度の値域を0〜1にするとまた変わるのかなー．</p>
		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22162&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22162&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Mon, 09 Nov 2009 05:46:30 +0000</pubDate>
    <dc:creator>Yuki Anai</dc:creator>
  </item>

  <item>
    <title>KOF2009 一日目</title>
    <guid isPermaLink="false">http://blog.kimuradb.com/?eid=818474</guid>
    <link>http://blog.kimuradb.com/?eid=818474</link>
    <description>

関西オープンソース2009
関西コミュニティ大決戦

開始しました。今年は参加者も少し少なめかな？セミナー数も例年より少なく感じました。Zen Cartでお世話になっているオビタスターさんに、Openbravo POSを教えてもらう。オープンソースのPOS!かっこいい。

木村自身は先日告知したとおり、東京と同じMySQL Workbenchネタをやりました。MyQueryのオチがあまりうけなくて残念。

私の前のコマでは、以前CLUB DB2でRoRについて語ってもらった大場さんがここでもRoRについて語ってらっしゃいました。</description>
    <content:encoded><![CDATA[<img src="http://blog.kimuradb.com/images/moblog_584811.JPG" class="pict" alt="" width="640" height="480" /><br />
<p><br />
関西オープンソース2009<br />
関西コミュニティ大決戦<br />
<br />
開始しました。今年は参加者も少し少なめかな？セミナー数も例年より少なく感じました。Zen Cartでお世話になっているオビタスターさんに、<a href="http://wiki.openbravo.com/wiki/Openbravo_POS_Integration/ja" target="_blank">Openbravo POSを教えてもらう。オープンソースのPOS!</a>かっこいい。<br />
<br />
木村自身は先日告知したとおり、東京と同じMySQL Workbenchネタをやりました。MyQueryのオチがあまりうけなくて残念。<br />
<br />
私の前のコマでは、以前<a href="https://www.ibm.com/developerworks/wikis/display/clubdb2/Home" target="_blank">CLUB DB2</a>でRoRについて語ってもらった大場さんがここでもRoRについて語ってらっしゃいました。<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22142&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22142&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Fri, 06 Nov 2009 14:10:28 +0000</pubDate>
    <dc:creator>MeijiK</dc:creator>
    <category>オープンソース</category>
  </item>

  <item>
    <title>XtraBackup Windows版</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-7661288799334918410.post-5274568261047943188</guid>
    <link>http://buildup-db.blogspot.com/2009/11/xtrabackup-windows.html</link>
    <description>今回は、速報なので短いです。「Linuxだけでたまたま動いていた感」のあるXtraBackupですが、私がいろいろ直しているうちに、最新revisionはWindowsでも動くようになったそうです！次のリリースではWindows版も出てくると思います。乞うご期待！！「そうです」というのは、私はWindowsの開発環境を持っていないし良く分からないので、寄せられたスタックトレースだけを頼りに気合いで直しています。しかし、それで良く動いたものです。。。。</description>
    <content:encoded><![CDATA[今回は、速報なので短いです。<br /><br />「Linuxだけでたまたま動いていた感」のあるXtraBackupですが、私がいろいろ直しているうちに、最新revisionはWindowsでも動くようになったそうです！次のリリースではWindows版も出てくると思います。乞うご期待！！<br /><br />「そうです」というのは、私はWindowsの開発環境を持っていないし良く分からないので、寄せられたスタックトレースだけを頼りに気合いで直しています。しかし、それで良く動いたものです。。。。<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/7661288799334918410-5274568261047943188?l=buildup-db.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22131&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22131&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Fri, 06 Nov 2009 08:34:00 +0000</pubDate>
    <dc:creator>Yasufumi Kinoshita</dc:creator>
  </item>

  <item>
    <title>[ohamari][mysql] あるあるおハマり大事典 - InnoDBなのに行ロックしないの</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/hirose31/20091106/1257493652</guid>
    <link>http://d.hatena.ne.jp/hirose31/20091106/1257493652</link>
    <description>

drop table if exists t;

create table t (
  iid int
 ,nid int
 ,bid binary(3)
 ,msg varchar(69)
 ,key (iid)
 ,key (bid)
) ENGINE=InnoDB;

insert into t values
 (1,1,1,&amp;#34;ichi&amp;#34;),(2,2,2,&amp;#34;ni&amp;#34;),(3,3,3,&amp;#34;san&amp;#34;)
,(4,4,4,&amp;#34;si&amp;#34;),(5,5,5,&amp;#34;go&amp;#34;),(6,6,6,&amp;#34;roku&amp;#34;)
;


			なテーブルとデータで、2つ端末を用意して update しあいっこしてみます。
			

			まず、これ↓は両方ともupdateが完了してスコっと返ってきます。行レベルロック++

begin;
update t set msg = &amp;#34;t1&amp;#34; where iid = 1;
と
begin;
update t set msg = &amp;#34;t2&amp;#34; where iid = 2;


			

			これ↓は、where句で使っているのが、インデックスがはられていないカラムなので、後発のクエリはすぐ返らず(先発のがcommit or rollback or タイムアウトするまで)待たされます。これも期待通り。

begin;
update t set msg = &amp;#34;t1&amp;#34; where nid = 1;
と
begin;
update t set msg = &amp;#34;t2&amp;#34; where nid = 2;


			

			で、おハマりしたのがこれ↓。intじゃなくてbinary型なんだけどちゃんとインデックスははってあるのになんでか後発のが待たされてしまいます。

begin;
update t set msg = &amp;#34;t1&amp;#34; where bid = 1;
と
begin;
update t set msg = &amp;#34;t2&amp;#34; where bid = 2;


			さて、どうして行レベルロックにならずに後発のクエリが待たされるのでしょうか？
			答えはこのあとすぐ！！
			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			まだだよー
			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			そろそろいくよー
			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			

			


explain select * from t where bid = 1\G


			とかするとわかるんですが、なんと「type: ALL」でフルテーブルスキャンになってます。なのでテーブル全体にロックがかかってると。
			フルスキャンになる理由は、数値型→binary型への型変換がかかるせいかなと思います。
			なので、

begin;
update t set msg = &amp;#34;zero&amp;#34; where bid = '1\0\0';
と
begin;
update t set msg = &amp;#34;zero&amp;#34; where bid = '2\0\0';


			とすると、後発のもすぐに返ってきます。
			bid = 1 でもちゃんとマッチするので、型変換のことをずっぽし見落としてました＞＜
			今回も id:kazuhooku さんに多大なるご支援、ご協力を賜りましてほんとうにありがとうございました。
		</description>
    <content:encoded><![CDATA[<div>
<pre>
<span>drop</span> <span>table</span> <span>if</span> <span>exists</span> t;

<span>create</span> <span>table</span> t (
  iid int
 ,nid int
 ,bid binary(<span>3</span>)
 ,msg <span>varchar</span>(<span>69</span>)
 ,key (iid)
 ,key (bid)
) ENGINE=InnoDB;

<span>insert</span> <span>into</span> t <span>values</span>
 (<span>1</span>,<span>1</span>,<span>1</span>,<span>&#34;ichi&#34;</span>),(<span>2</span>,<span>2</span>,<span>2</span>,<span>&#34;ni&#34;</span>),(<span>3</span>,<span>3</span>,<span>3</span>,<span>&#34;san&#34;</span>)
,(<span>4</span>,<span>4</span>,<span>4</span>,<span>&#34;si&#34;</span>),(<span>5</span>,<span>5</span>,<span>5</span>,<span>&#34;go&#34;</span>),(<span>6</span>,<span>6</span>,<span>6</span>,<span>&#34;roku&#34;</span>)
;
</pre>

			<p>なテーブルとデータで、2つ端末を用意して update しあいっこしてみます。</p>
			<br>

			<p>まず、これ↓は両方ともupdateが完了してスコっと返ってきます。行レベルロック++</p>
<pre>
<span>begin</span>;
<span>update</span> t <span>set</span> msg = <span>&#34;t1&#34;</span> <span>where</span> iid = <span>1</span>;
と
<span>begin</span>;
<span>update</span> t <span>set</span> msg = <span>&#34;t2&#34;</span> <span>where</span> iid = <span>2</span>;
</pre>

			<br>

			<p>これ↓は、where句で使っているのが、インデックスがはられていないカラムなので、後発のクエリはすぐ返らず(先発のがcommit or rollback or タイムアウトするまで)待たされます。これも期待通り。</p>
<pre>
<span>begin</span>;
<span>update</span> t <span>set</span> msg = <span>&#34;t1&#34;</span> <span>where</span> nid = <span>1</span>;
と
<span>begin</span>;
<span>update</span> t <span>set</span> msg = <span>&#34;t2&#34;</span> <span>where</span> nid = <span>2</span>;
</pre>

			<br>

			<p>で、おハマりしたのがこれ↓。intじゃなくてbinary型なんだけどちゃんとインデックスははってあるのになんでか後発のが待たされてしまいます。</p>
<pre>
<span>begin</span>;
<span>update</span> t <span>set</span> msg = <span>&#34;t1&#34;</span> <span>where</span> bid = <span>1</span>;
と
<span>begin</span>;
<span>update</span> t <span>set</span> msg = <span>&#34;t2&#34;</span> <span>where</span> bid = <span>2</span>;
</pre>

			<p>さて、どうして行レベルロックにならずに後発のクエリが待たされるのでしょうか？</p>
			<p>答えはこのあとすぐ！！</p>
			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<p>まだだよー</p>
			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<p>そろそろいくよー</p>
			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<br>

			<a name="seemore"></a>

			<br>

<pre>
<span>explain</span> <span>select</span> * <span>from</span> t <span>where</span> bid = <span>1</span>\G
</pre>

			<p>とかするとわかるんですが、なんと「type: ALL」でフルテーブルスキャンになってます。なのでテーブル全体にロックがかかってると。</p>
			<p>フルスキャンになる理由は、数値型→binary型への型変換がかかるせいかなと思います。</p>
			<p>なので、</p>
<pre>
<span>begin</span>;
<span>update</span> t <span>set</span> msg = <span>&#34;zero&#34;</span> <span>where</span> bid = <span>'1\0\0'</span>;
と
<span>begin</span>;
<span>update</span> t <span>set</span> msg = <span>&#34;zero&#34;</span> <span>where</span> bid = <span>'2\0\0'</span>;
</pre>

			<p>とすると、後発のもすぐに返ってきます。</p>
			<p>bid = 1 でもちゃんとマッチするので、型変換のことをずっぽし見落としてました＞＜</p>
			<p>今回も <a href="http://d.hatena.ne.jp/kazuhooku/">id:kazuhooku</a> さんに多大なるご支援、ご協力を賜りましてほんとうにありがとうございました。</p>
		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22129&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22129&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Fri, 06 Nov 2009 07:47:32 +0000</pubDate>
    <dc:creator>ひろせ まさあき</dc:creator>
  </item>

  <item>
    <title>Opensource Conference 2009 Tokyo/Fallに参加しました!</title>
    <guid isPermaLink="false">http://blogs.mysql.com/teamapac/?p=255</guid>
    <link>http://blogs.mysql.com/teamapac/2009/11/04/opensource-conference-2009-tokyofall%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</link>
    <description>サン・マイクロシステムズは年間スポンサーとしてOSCを応援しています。去る10月30、31日に蒲田にて開催されたOpensource Conference 2009 Tokyo/Fall にサン・マイクロシステムズも参加しました。
この度のOSCは、2日間で約1,600名の参加者を迎え、大盛況のうちに幕を閉じました。
今回、サン・マイクロシステムズ企業セッション枠にはMySQLシニアエバンジェリストの梶山によるセッションが、また、MyNAコミュニティ枠でMySQLシニアサポートエンジニアの木村によるセッションがありました。
また、サン･マイクロシステムズの企業ブースでは、MySQLチームのメンバーが皆様をお迎えしました!ブースでは、MyQL 製品をはじめ、GlassFishやSun Open SSO製品をご紹介しました。システム運用管理、最適化、パフォーマンスチューニングを迅速に、かつ簡単に可能にする監視ツールであるMySQL Enterprise Monitor のデモもご覧いただきました。木村のセッションでも少しご案内しましたが、これは、MySQL コミュニティ版には含まれないEnterprise ツールです。この機会にぜひ、MySQL監視ツールについてももっと知っていただければ幸いです。
ブースにお立ちよりいただいた皆様、どうもありがとうございました!
MySQLマスコットのイルカ(Sakila)は相変わらず、OSCでも大人気でした。
今後ともどうぞよろしくお願いたします。
三橋</description>
    <content:encoded><![CDATA[<p>サン・マイクロシステムズは年間スポンサーとしてOSCを応援しています。去る10月30、31日に蒲田にて開催されたOpensource Conference 2009 Tokyo/Fall にサン・マイクロシステムズも参加しました。<br />
この度のOSCは、2日間で約1,600名の参加者を迎え、大盛況のうちに幕を閉じました。</p>
<p>今回、サン・マイクロシステムズ企業セッション枠にはMySQLシニアエバンジェリストの梶山によるセッションが、また、MyNAコミュニティ枠でMySQLシニアサポートエンジニアの木村によるセッションがありました。<br />
また、サン･マイクロシステムズの企業ブースでは、MySQLチームのメンバーが皆様をお迎えしました!ブースでは、MyQL 製品をはじめ、GlassFishやSun Open SSO製品をご紹介しました。システム運用管理、最適化、パフォーマンスチューニングを迅速に、かつ簡単に可能にする監視ツールであるMySQL Enterprise Monitor のデモもご覧いただきました。木村のセッションでも少しご案内しましたが、これは、MySQL コミュニティ版には含まれないEnterprise ツールです。この機会にぜひ、MySQL監視ツールについてももっと知っていただければ幸いです。</p>
<p>ブースにお立ちよりいただいた皆様、どうもありがとうございました!<br />
MySQLマスコットのイルカ(Sakila)は相変わらず、OSCでも大人気でした。</p>
<p>今後ともどうぞよろしくお願いたします。</p>
<p>三橋</p><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22069&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22069&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Wed, 04 Nov 2009 09:41:04 +0000</pubDate>
    <dc:creator>TeamApac</dc:creator>
    <category>1</category>
  </item>

  <item>
    <title>MySQL Clusterが苦手とするJOINを如何にして克服するべきか。</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-1906500952232920237.post-4880651998551099912</guid>
    <link>http://nippondanji.blogspot.com/2009/11/mysql-clusterjoin.html</link>
    <description>シェアードナッシング型の負荷分散機能を持ち、なおかつ同期レプリケーションによるHA機能まで備えたMySQL Cluster最大の弱点といえば、JOINの遅さであろう。MySQL ClusterのJOINは偽りなく遅い。JOINを多用するアプリケーションでMySQL Clusterを利用するのはある意味マゾヒスティックな行為であると言えよう。何故MySQL ClusterはJOINが遅いのか？それはMySQL Clusterが分散データベースだからである。ご存じの通り、MySQLにおけるJOINのアルゴリズムにはNested Loopしかない。他のストレージエンジンを利用していればそれでも十分実用に耐えうるぐらい高速なのだが、MySQL Clusterの場合はそうはいかない。JOINでは自ずとストレージエンジンからデータをフェッチする回数が増えるが、MySQL Clusterの場合レコードのフェッチはネットワークを経由しなければいけないのでここがボトルネックになってしまう。例えば、2つのNDBストレージエンジン（MySQL Cluster）のテーブルをJOINする場合を考えよう。外部表からM行フェッチし、外部表の一行につき内部表から平均でN行フェッチする必要があるとする。その場合、外部表から1回（1回のスキャンオペレーションでデータをフェッチできる）、内部表からM回のフェッチをしなければならない。1回のフェッチにつき、ネットワーク上をパケットが往復するわけであるから、InnoDBやMyISAMのように同一ホストから（特にメモリ上のキャッシュから）データをフェッチする場合と比べてJOINは不利なのである。ではMySQL ClusterにおいてJOINを高速化するにはどうすればいいだろうか？単純に「ネットワーク接続を高速化すればいいじゃないか。10GbEのNICを使えば？」などと思うかも知れない。それはある意味正しいが、正しいアプローチではないと思う。確かにJOINの性能は向上するのだが、10GbEとてレイテンシは無視できないので同一ホスト上のメモリからデータをフェッチする場合より遅いのは明らかである。少し話はそれるが、何かを処理するユニットを増強して（もしくはたくさん並べて）何とかしてしまおうというのは、いかにもBruteなやり方である。確かにハードウェアの性能向上はBruteなやり方でも良いと思うし、Bruteなやり方で成功した事例もたくさんある。例えばグラフィックスチップにたくさんの演算回路（シェーダ）を組み込んだり、ハイエンドサーバにCPUを満載したり、安価なマシンを並べてスケールアウトしたり。しかし、Bruteなアプローチではシステムの性能の限界はハードウェアの性能の限界によって頭打ちしてしまうことになる。だが一方で、ソフトウェアの性能向上を考える場合には、同じ条件のハードウェアで如何に高速化するかということを検討しなければならないと思う。つまり、もっとSmartなやり方でないといけない。ハードウェアはBruteに。ソフトウェアはSmartに。それがシステムを高速化する際のコツだろう。そんなわけで話は戻るが、つまり単純にネットワーク接続を高速化するのは、一定の効果は上がるがすぐに限界を迎えてしまう可能性が高いのである。現時点でも実装可能かつスマートなアプローチは、レプリケーションを利用することである。Kaj Arno氏のエントリでも紹介されているが、MySQL Clusterから通常のMySQL Serverへのレプリケーションを行い、JOINを伴う複雑なSELECTに関してはスレーブで実行することにより、複雑なSELECTを高速化するというテクニックが存在する。（詳細はKaj氏のブログエントリの図を参照して頂きたい。）スレーブへのレプリケーションは非同期なので、厳密な最新のデータに対するクエリは実行出来ないが、厳密な最新のデータが必要ない場合この方法は大抵うまくいく。システムの構築がちょっと面倒臭くなる以外弊害もない。複雑なクエリは集計データなどに利用されることが多いので、適用出来るシーンも多いだろう。この方法で気をつけるべきポイントは、replicate[-wild]-do-tableやreplicate[-wild]-ignore-tableオプションを利用して、複製するテーブルを限定することである。そうしないとndb_apply_statusテーブルへの更新が出来ないというエラーに見舞われてしまうことになる。MySQL Clusterテーブルを更新すると、バイナリログは自動的にmysql.ndb_apply_statusテーブルへの更新が含まれてしまう。このテーブルはNDBストレージエンジンで定義されているテーブルでMySQL Cluster同士のレプリケーションに利用されるのだが、MySQL Clusterから通常のMySQL Serverへレプリケーションする場合には不要などころかエラーの元凶になるだけなのできっちりとフィルタリングしておこう。例えば、worldデータベースに存在するテーブルだけを対象にしたい場合は、スレーブのmy.cnfに次のようにreplicate-wild-do-tableを使って記述するといいだろう。[mysqld]replicate-wild-do-table=world.%MySQL ClusterのSQLノード上で新規にテーブルを作成する場合、つまりCREATE TABLE tbl(...) ENGINE NDB;とした場合に、スレーブ側ではデフォルトのストレージエンジンが使用されることになる点にも注意したい。（通常のMySQL ServerにはNDBストレージエンジンは含まれていないからだ。）--storage-engineオプションを好みのもの（InnoDB等）に設定しておこう。しかし、MySQL Clusterの開発者たちは、JOINが遅いという現状をいつまでも放置しておくつもりはない。将来的にはMySQL ClusterのJOIN性能は大幅に改善される予定である。まず、近い将来に搭載される機能として挙げられるのがBKA（Batched Key Access）というJOIN最適化手法である。この方法では、これまで1+M回必要だったデータのフェッチが、最も効率的な場合にはたったの2回にまで減少する。2つのNDBテーブルのJOINにおいて外部表からM行フェッチし、外部表の一行につき内部表から平均でN行フェッチする必要がある場合、BKAの動作は次のようになる。外部表からM行フェッチ（一回のスキャン）JOINに利用するキーの値をリストアップする。リストアップされたキーをNDBストレージエンジンにPush-Downする。内部表からN行フェッチ（一回のスキャン）内部表からレコードをフェッチする際、ICT（Index Condition Pushdown）という機能が利用されるのだが、ICTではストレージエンジンに対してフェッチしたい行を含むキーを一気に送信し、レコードを一気にフェッチするのである。その結果、MySQL Clusterではネットワーク上のパケット往復の回数が劇的に減少し、JOINの性能が向上するというわけだ。従って、BKAが実装された暁には、通常のMySQL Serverへレプリケーションするといった面倒な運用は一切不要になるだろう。少なくとも他のストレージエンジンと同等程度までJOINの性能が改善するはずであるから。BKAブラボー！！と思うかも知れない。しかし、そんなところで終わるようなMySQL Cluster開発チームではないのである！！実装されるのはかなり先になるだろうが、MySQL ClusterのJOINを劇的に高速化することが出来ると予想される機能が実装される見込みである。それはDbspjと呼ばれる機能であり、言うなれば「分散JOIN」とでも呼ぶべきシロモノである。かなり貪欲な性能の追求である。MySQL Clusterは分散型のRDBMSであるから、JOINの処理も分散して行えば良いじゃないかと考えるのが人情というもであるが、一方でそのような機能を実装するのは難しいということもまた事実である。（従って現時点ではそのような機能は実装されていない。）しかし難しいというのを理由にして諦めないのが真の漢。MySQL Cluster開発チームはこの難題にチャレンジしており、既に初期段階のテスト結果が開発者Jonas Oreland氏のブログで公表されている。ぶっちゃけ通常のJOINと比べると格段に速い。MySQL Clusterの正式リリースに搭載されるのはずっと先になるだろうが、楽しみな機能の一つである。</description>
    <content:encoded><![CDATA[シェアードナッシング型の負荷分散機能を持ち、なおかつ同期レプリケーションによるHA機能まで備えた<b><span>MySQL Cluster最大の弱点といえば、JOINの遅さであろう。</span></b>MySQL ClusterのJOINは偽りなく遅い。JOINを多用するアプリケーションでMySQL Clusterを利用するのはある意味マゾヒスティックな行為であると言えよう。<b>何故MySQL ClusterはJOINが遅いのか？それはMySQL Clusterが分散データベースだからである。</b><br /><br />ご存じの通り、MySQLにおけるJOINのアルゴリズムにはNested Loopしかない。他のストレージエンジンを利用していればそれでも十分実用に耐えうるぐらい高速なのだが、MySQL Clusterの場合はそうはいかない。JOINでは自ずとストレージエンジンからデータをフェッチする回数が増えるが、<b>MySQL Clusterの場合レコードのフェッチはネットワークを経由しなければいけないのでここがボトルネックになってしまう。</b><br /><br />例えば、2つのNDBストレージエンジン（MySQL Cluster）のテーブルをJOINする場合を考えよう。外部表からM行フェッチし、外部表の一行につき内部表から平均でN行フェッチする必要があるとする。その場合、外部表から1回（1回のスキャンオペレーションでデータをフェッチできる）、内部表からM回のフェッチをしなければならない。1回のフェッチにつき、ネットワーク上をパケットが往復するわけであるから、InnoDBやMyISAMのように同一ホストから（特にメモリ上のキャッシュから）データをフェッチする場合と比べてJOINは不利なのである。<br /><br /><div><b><i>ではMySQL ClusterにおいてJOINを高速化するにはどうすればいいだろうか？</i></b><br /></div><br />単純に<b>「ネットワーク接続を高速化すればいいじゃないか。10GbEのNICを使えば？」</b>などと思うかも知れない。それはある意味正しいが、正しいアプローチではないと思う。確かにJOINの性能は向上するのだが、10GbEとてレイテンシは無視できないので同一ホスト上のメモリからデータをフェッチする場合より遅いのは明らかである。<br /><br />少し話はそれるが、何かを処理するユニットを増強して（もしくはたくさん並べて）何とかしてしまおうというのは、いかにも<b><span>Brute</span></b>なやり方である。確かにハードウェアの性能向上はBruteなやり方でも良いと思うし、Bruteなやり方で成功した事例もたくさんある。例えばグラフィックスチップにたくさんの演算回路（シェーダ）を組み込んだり、ハイエンドサーバにCPUを満載したり、安価なマシンを並べてスケールアウトしたり。しかし、Bruteなアプローチではシステムの性能の限界はハードウェアの性能の限界によって頭打ちしてしまうことになる。だが一方で、ソフトウェアの性能向上を考える場合には、同じ条件のハードウェアで如何に高速化するかということを検討しなければならないと思う。つまり、もっと<b><span>Smart</span></b>なやり方でないといけない。<b><span><span>ハードウェアはBruteに。ソフトウェアはSmartに。</span></span></b>それがシステムを高速化する際のコツだろう。<br /><br />そんなわけで話は戻るが、つまり単純にネットワーク接続を高速化するのは、一定の効果は上がるがすぐに限界を迎えてしまう可能性が高いのである。<br /><br /><b>現時点でも実装可能かつスマートなアプローチは、レプリケーションを利用することである。</b><a href="http://blogs.mysql.com/kaj/2007/12/10/combining-mysql-proxy-with-mysql-cluster/"><b>Kaj Arno氏のエントリでも紹介されている</b></a>が、MySQL Clusterから通常のMySQL Serverへのレプリケーションを行い、JOINを伴う複雑なSELECTに関してはスレーブで実行することにより、複雑なSELECTを高速化するというテクニックが存在する。（詳細は<b><a href="http://kaj.arno.fi/ProxyCluster5.png">Kaj氏のブログエントリの図</a></b>を参照して頂きたい。）スレーブへのレプリケーションは非同期なので、厳密な最新のデータに対するクエリは実行出来ないが、厳密な最新のデータが必要ない場合この方法は大抵うまくいく。システムの構築がちょっと面倒臭くなる以外弊害もない。複雑なクエリは集計データなどに利用されることが多いので、適用出来るシーンも多いだろう。<br /><br />この方法で気をつけるべきポイントは、<span>replicate[-wild]-do-table</span>や<span>replicate[-wild]-ignore-table</span>オプションを利用して、複製するテーブルを限定することである。そうしないとndb_apply_statusテーブルへの更新が出来ないというエラーに見舞われてしまうことになる。MySQL Clusterテーブルを更新すると、バイナリログは自動的にmysql.ndb_apply_statusテーブルへの更新が含まれてしまう。このテーブルはNDBストレージエンジンで定義されているテーブルでMySQL Cluster同士のレプリケーションに利用されるのだが、MySQL Clusterから通常のMySQL Serverへレプリケーションする場合には不要などころかエラーの元凶になるだけなのできっちりとフィルタリングしておこう。例えば、worldデータベースに存在するテーブルだけを対象にしたい場合は、スレーブのmy.cnfに次のようにreplicate-wild-do-tableを使って記述するといいだろう。<br /><br /><pre>[mysqld]<br />replicate-wild-do-table=world.%<br /></pre><br />MySQL ClusterのSQLノード上で新規にテーブルを作成する場合、つまり<span>CREATE TABLE tbl(...) ENGINE NDB;</span>とした場合に、スレーブ側ではデフォルトのストレージエンジンが使用されることになる点にも注意したい。（通常のMySQL ServerにはNDBストレージエンジンは含まれていないからだ。）--storage-engineオプションを好みのもの（InnoDB等）に設定しておこう。<br /><br /><div><b><i>しかし、MySQL Clusterの開発者たちは、JOINが遅いという現状をいつまでも放置しておくつもりはない。</i></b><br /></div><br /><b></b>将来的にはMySQL ClusterのJOIN性能は大幅に改善される予定である。まず、近い将来に搭載される機能として挙げられるのが<a href="http://forge.mysql.com/wiki/Batched_Key_Access"><b>BKA（Batched Key Access）</b></a>というJOIN最適化手法である。この方法では、<b>これまで1+M回必要だったデータのフェッチが、最も効率的な場合にはたったの2回にまで減少する。</b>2つのNDBテーブルのJOINにおいて外部表からM行フェッチし、外部表の一行につき内部表から平均でN行フェッチする必要がある場合、BKAの動作は次のようになる。<br /><ol><li>外部表からM行フェッチ（一回のスキャン）</li><li>JOINに利用するキーの値をリストアップする。</li><li>リストアップされたキーをNDBストレージエンジンにPush-Downする。</li><li>内部表からN行フェッチ（一回のスキャン）</li></ol>内部表からレコードをフェッチする際、ICT（Index Condition Pushdown）という機能が利用されるのだが、ICTではストレージエンジンに対してフェッチしたい行を含むキーを一気に送信し、レコードを一気にフェッチするのである。その結果、MySQL Clusterではネットワーク上のパケット往復の回数が劇的に減少し、JOINの性能が向上するというわけだ。従って、BKAが実装された暁には、通常のMySQL Serverへレプリケーションするといった面倒な運用は一切不要になるだろう。少なくとも他のストレージエンジンと同等程度までJOINの性能が改善するはずであるから。<br /><br /><div><b><i>BKAブラボー！！と思うかも知れない。</i></b><br /><b><i>しかし、そんなところで終わるようなMySQL Cluster開発チームではないのである！！</i></b><br /></div><br />実装されるのはかなり先になるだろうが、MySQL ClusterのJOINを劇的に高速化することが出来ると予想される機能が実装される見込みである。それはDbspjと呼ばれる機能であり、言うなれば<b><span>「分散JOIN」</span></b>とでも呼ぶべきシロモノである。かなり貪欲な性能の追求である。MySQL Clusterは分散型のRDBMSであるから、JOINの処理も分散して行えば良いじゃないかと考えるのが人情というもであるが、一方でそのような機能を実装するのは難しいということもまた事実である。（従って現時点ではそのような機能は実装されていない。）<b><span>しかし難しいというのを理由にして諦めないのが真の漢。</span></b>MySQL Cluster開発チームはこの難題にチャレンジしており、既に初期段階のテスト結果が<b><a href="http://jonasoreland.blogspot.com/2009/10/dbspj-preliminary-numbers.html">開発者Jonas Oreland氏のブログで公表されている。</a></b>ぶっちゃけ通常のJOINと比べると格段に速い。MySQL Clusterの正式リリースに搭載されるのはずっと先になるだろうが、楽しみな機能の一つである。<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1906500952232920237-4880651998551099912?l=nippondanji.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22067&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22067&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Wed, 04 Nov 2009 03:27:00 +0000</pubDate>
    <dc:creator>Mikiya Okuno</dc:creator>
    <category>roadmap</category>
    <category>mysql cluster</category>
    <category>mysql</category>
    <category>performance tuning</category>
  </item>

  <item>
    <title>[MySQL][Spider]Spider-2.8リリース</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-1243249875644802246.post-5855763114895604282</guid>
    <link>http://wild-growth-ja.blogspot.com/2009/11/mysqlspiderspider-28.html</link>
    <description>Spiderストレージエンジンのバージョン 2.8(beta)をリリースしました。Spiderストレージエンジンは、database sharding用のストレージエンジンです。http://spiderformysql.com/今回の主な変更は以下です。・テーブルパラメータに「link_status」を追加しました。　このパラメータにより、alter table文を利用してリンクの障害状況を変更することができます。　なお、Spiderのリンク障害状況管理は、テーブル単位で行われます。それ以外の変更については、ダウンロードドキュメント中の「99_change_logs.txt」をご確認下さい。</description>
    <content:encoded><![CDATA[Spiderストレージエンジンのバージョン 2.8(beta)をリリースしました。<br />Spiderストレージエンジンは、database sharding用のストレージエンジンです。<br /><a href="http://spiderformysql.com/">http://spiderformysql.com/</a><br /><br />今回の主な変更は以下です。<br />・テーブルパラメータに「link_status」を追加しました。<br />　このパラメータにより、alter table文を利用してリンクの障害状況を変更することができます。<br />　なお、Spiderのリンク障害状況管理は、テーブル単位で行われます。<br /><br />それ以外の変更については、ダウンロードドキュメント中の「99_change_logs.txt」をご確認下さい。<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1243249875644802246-5855763114895604282?l=wild-growth-ja.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22066&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22066&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Tue, 03 Nov 2009 22:11:00 +0000</pubDate>
    <dc:creator>斯波健徳</dc:creator>
    <category>MySQL</category>
    <category>Spider</category>
  </item>

  <item>
    <title>今週末はKOF(関西オープンソース決戦)2009</title>
    <guid isPermaLink="false">http://blog.kimuradb.com/?eid=817245</guid>
    <link>http://blog.kimuradb.com/?eid=817245</link>
    <description>先週末はOSC2009Tokyo/Fallでしたが、今週末は場所を大阪に移し、関西オープンソース決戦(KOF)2009が11/6(Fri), 11/7(Sat)に行われます。

まずは11/6(Fri)にOSC2009Tokyo/Fallで行ったものと同じセミナーを行いますので、ご興味のある方は是非ご参加ください。

MySQL Workbenchを使ってみよう！〜MySQL GUI Toolsのご紹介〜</description>
    <content:encoded><![CDATA[先週末はOSC2009Tokyo/Fallでしたが、今週末は場所を大阪に移し、関西オープンソース決戦(KOF)2009が11/6(Fri), 11/7(Sat)に行われます。<br />
<br />
まずは11/6(Fri)にOSC2009Tokyo/Fallで行ったものと同じセミナーを行いますので、ご興味のある方は是非ご参加ください。<br />
<br />
<a href="http://k-of.jp/2009/list_seminar.html#10" target="_blank">MySQL Workbenchを使ってみよう！〜MySQL GUI Toolsのご紹介〜</a><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22056&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22056&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Mon, 02 Nov 2009 14:51:26 +0000</pubDate>
    <dc:creator>MeijiK</dc:creator>
    <category>オープンソース</category>
  </item>

  <item>
    <title>GPLソフトウェアのパッチをBSDライセンスで提供することの意義</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-1906500952232920237.post-1352708119926518083</guid>
    <link>http://nippondanji.blogspot.com/2009/11/gplbsd.html</link>
    <description>先日の投稿「GPLが適用されているソフトウェア＝MySQLのパッチをBSDライセンスでリリースする。」では、GPLが適用されているソフトウェアにBSDライセンスのパッチを提供することが出来るということを書いた。ただし、それが出来ることによってどのような意義があるのかということについては触れていなかった。その結果、単独で動かないパッチに元のと違うライセンスをつける感覚がよくわからない。という疑問が生じたらしい（ブコメ参照）ので、パッチをBSDライセンスで提供するということはどういうことなのかを説明しようと思う。まず第一に、パッチ自身はBSDライセンスなので、BSDライセンスに従う限り他のプログラムへ流用することが出来る。パッチといえども、それが何かの機能を追加する類のものであれば巨大なプログラムになり得るだろう。事実、Googleが提供するMySQLのパッチもかなりデカイ。パッチの規模がでかくなれば、独立して機能する有益なロジックが多々含まれることになるだろう。パッチのライセンスがBSDライセンスであれば、その機能をGPL以外のライセンスのソフトウェア、例えばBSDライセンスのPostgreSQLなどに追加するということも可能である。つまり、パッチをBSDライセンスにすることで、MySQLとPostgreSQLに同じ機能を追加するということが出来るわけだ。第二に、MySQLはデュアルライセンスなので、BSDライセンスで提供されたパッチであればGPL版とコマーシャルライセンス版の両方に機能を追加することが出来る。従って、BSDライセンスのパッチはMySQLにとっては都合が良いのである。（MySQLがデュアルライセンスを貫く以上、GPLで提供されたパッチは適用出来ないのである。）ちなみに、GPLソフトウェアであるMySQL 6.0からforkしたDrizzleも、全てのContributionはBSDライセンスのもとに行われている。（Drizzleに提供された全てのソースコードはBSDライセンスが適用されている。）従って、Drizzleに追加された全ての機能は、GPL版、コマーシャルライセンス版のいずれのMySQLにも取り込むことが出来るのである。また、DrizzleにContributeされたコードは、PostgreSQLなどの他のライセンスのRDBMSソフトウェアにも取り込むことが出来るので、PostgreSQLerの人は是非Drizzleのソースコードを覗いて見ると良いのではないだろうか。ただし、Drizzleでは積極的に外部のライブラリを取り込んで利用しようという方針があるので、外部のGPLが適用されたライブラリに依存した機能については、BSDライセンスによる利用は出来ない点には注意が必要である。（もちろん元のMySQL 6.0から残っているコードはPostgreSQLに取り込むことは出来ないので注意しよう。）さて、ここまで書くと「GPLよりBSDライセンスの方が優れている」ということを言い出す人が居るかも知れないので、この点について少し捕捉しておく。GPLとBSDライセンスを比較するのはハッキリ言って無意味である。確かにBSDライセンスの方が再利用出来るソフトウェアの範囲が広い。（商用、無償、プロプラエタリ、OSSを問わず利用可能である。）しかし一方で、GPLはソフトウェアの利用者に（それをカスタマイズすることを含めて）未来永劫最大限の自由を約束するライセンスであり、GPLを継承することによって再利用可能な場面が限定されることは、その自由を約束するために必要な措置なのである。つまり、GPLとBSDライセンスはそれぞれ異なる属性を持ったライセンス（かたやCopyleft、かたやPermissive）であり、それぞれのライセンスを適切に使い分けるのが重要だということである。ライセンスに対する理解とそれらの使い分けは、オープンソースに生きる人々にとっては最も重要な嗜みと言えるだろう。</description>
    <content:encoded><![CDATA[<div><span>先日の投稿「</span><span><span><a href="http://nippondanji.blogspot.com/2009/10/gplmysqlbsd.html"><span>GPLが適用されているソフトウェア＝MySQLのパッチをBSDライセンスでリリースする。</span></a></span><span>」</span></span><span><span>では、GPLが適用されているソフトウェアにBSDライセンスのパッチを提供することが出来るということを書いた。ただし、それが出来ることによってどのような意義があるのかということについては触れていなかった。その結果、</span></span><br /></div><blockquote><span>単独で動かないパッチに元のと違うライセンスをつける感覚がよくわからない。</span><br /></blockquote><div><span><span><span>という疑問が生じたらしい（</span><a href="http://b.hatena.ne.jp/entry/nippondanji.blogspot.com/2009/10/gplmysqlbsd.html"><span>ブコメ参照</span></a><span>）ので、パッチをBSDライセンスで提供するということはどういうことなのかを説明しようと思う。<br /><br />まず第一に、パッチ自身はBSDライセンスなので、BSDライセンスに従う限り他のプログラムへ流用することが出来る。</span><b><span>パッチといえども、それが何かの機能を追加する類のものであれば巨大なプログラムになり得るだろう。</span></b><span>事実、Googleが提供するMySQLのパッチもかなりデカイ。パッチの規模がでかくなれば、独立して機能する有益なロジックが多々含まれることになるだろう。パッチのライセンスがBSDライセンスであれば、その機能をGPL以外のライセンスのソフトウェア、例えばBSDライセンスのPostgreSQLなどに追加するということも可能である。つまり、パッチをBSDライセンスにすることで、</span><b><span>MySQLとPostgreSQLに同じ機能を追加するということが出来る</span></b><span>わけだ。<br /><br />第二に、</span><b><span>MySQLはデュアルライセンスなので、BSDライセンスで提供されたパッチであればGPL版とコマーシャルライセンス版の両方に機能を追加することが出来る。</span></b><span>従って、BSDライセンスのパッチはMySQLにとっては都合が良いのである。（MySQLがデュアルライセンスを貫く以上、GPLで提供されたパッチは適用出来ないのである。）<br /><br />ちなみに、GPLソフトウェアであるMySQL 6.0からforkしたDrizzleも、</span><a href="http://drizzle.org/wiki/FAQ#How_are_my_contributions_licensed.3F"><span>全てのContributionはBSDライセンスのもとに行われている。</span></a><span>（Drizzleに提供された全てのソースコードはBSDライセンスが適用されている。）従って、Drizzleに追加された全ての機能は、GPL版、コマーシャルライセンス版のいずれのMySQLにも取り込むことが出来るのである。また、DrizzleにContributeされたコードは、PostgreSQLなどの他のライセンスのRDBMSソフトウェアにも取り込むことが出来るので、PostgreSQLerの人は是非Drizzleのソースコードを覗いて見ると良いのではないだろうか。ただし、Drizzleでは積極的に外部のライブラリを取り込んで利用しようという方針があるので、外部のGPLが適用されたライブラリに依存した機能については、BSDライセンスによる利用は出来ない点には注意が必要である。（もちろん元のMySQL 6.0から残っているコードはPostgreSQLに取り込むことは出来ないので注意しよう。）<br /><br />さて、ここまで書くと「GPLよりBSDライセンスの方が優れている」ということを言い出す人が居るかも知れないので、この点について少し捕捉しておく。</span><b><span>GPLとBSDライセンスを比較するのはハッキリ言って無意味である。</span></b><span>確かにBSDライセンスの方が再利用出来るソフトウェアの範囲が広い。（商用、無償、プロプラエタリ、OSSを問わず利用可能である。）しかし一方で、GPLはソフトウェアの利用者に（それをカスタマイズすることを含めて）未来永劫最大限の自由を約束するライセンスであり、GPLを継承することによって再利用可能な場面が限定されることは、その自由を約束するために必要な措置なのである。つまり、GPLとBSDライセンスはそれぞれ異なる属性を持ったライセンス（かたやCopyleft、かたやPermissive）であり、</span><b><span>それぞれのライセンスを適切に使い分けるのが重要</span></b><span>だということである。ライセンスに対する理解とそれらの使い分けは、オープンソースに生きる人々にとっては最も重要な嗜みと言えるだろう。</span></span></span><br /></div><div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1906500952232920237-1352708119926518083?l=nippondanji.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22029&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22029&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Sun, 01 Nov 2009 23:54:00 +0000</pubDate>
    <dc:creator>Mikiya Okuno</dc:creator>
    <category>oss</category>
    <category>mysql</category>
    <category>gpl</category>
    <category>postgresql</category>
  </item>

  <item>
    <title>OSC2009Tokyo/Fall 二日目</title>
    <guid isPermaLink="false">http://blog.kimuradb.com/?eid=817219</guid>
    <link>http://blog.kimuradb.com/?eid=817219</link>
    <description>今回の会場となった日本工学院専門学校　蒲田キャンパス12号館は、各部屋がガラス張りで明るい感じです。校舎も綺麗。




展示はスポンサー展示も含めて2F, セミナーは3F. 廊下も広く導線もこんがらがず、会場提供感謝です。木村はサンのブースとMyNA/Firebirdのブース運営が主で、今回はあまりセミナー見学ができなかったのが少し残念でした。夕方にブースを全部みてまわりました。Sugar CRMからforkしたというvTigerは興味深かったですね。日本語化プロジェクトもすすんでいるということで、無償で使いたい方は是非！

OS自作ということでは、本と本人のユニークさが際だつ川合さんが有名ですが、安価なハードに、個人で読み切れるソースコードで実装されたKOZOSが気になりました。私も一時期、組み込み関連の仕事をしていたことがあるのですが、なかなかよいレファレンスがないんですよね。組み込みOS. すぐにでもやりたいですが、諸般の事情により、とりあえずメモ。



</description>
    <content:encoded><![CDATA[今回の会場となった日本工学院専門学校　蒲田キャンパス12号館は、各部屋がガラス張りで明るい感じです。校舎も綺麗。<br />
<br />
<img src="http://blog.kimuradb.com/images/moblog_583486.JPG" class="pict" alt="" width="640" height="480" /><br />
<p></p><br />
<br />
展示はスポンサー展示も含めて2F, セミナーは3F. 廊下も広く導線もこんがらがず、会場提供感謝です。木村はサンのブースとMyNA/Firebirdのブース運営が主で、今回はあまりセミナー見学ができなかったのが少し残念でした。夕方にブースを全部みてまわりました。<a href="http://trombik.mine.nu/~cherry/w/index.php/2005/10/11/398/sugarcrm-vs-vtiger" target="_blank">Sugar CRMからforkした</a>というvTigerは興味深かったですね。<a href="http://forge.vtiger.com/plugins/wiki/index.php?id=104&amp;type=g" target="_blank">日本語化プロジェクト</a>もすすんでいるということで、無償で使いたい方は是非！<br />
<br />
<a href="http://www.amazon.co.jp/dp/4839919844" target="_blank">OS自作ということでは、本と本人のユニークさが際だつ川合さんが有名</a>ですが、<a href="http://www.saturn.dti.ne.jp/~hsakai/kozos/index.html" target="_blank">安価なハードに、個人で読み切れるソースコードで実装されたKOZOS</a>が気になりました。私も一時期、組み込み関連の仕事をしていたことがあるのですが、なかなかよいレファレンスがないんですよね。組み込みOS. すぐにでもやりたいですが、諸般の事情により、とりあえずメモ。<br />
<br />
<br />
<br />
<br /><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22053&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22053&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Sat, 31 Oct 2009 12:58:50 +0000</pubDate>
    <dc:creator>MeijiK</dc:creator>
    <category>MySQL</category>
  </item>

  <item>
    <title>OSC2009Tokyo/Fall 一日目</title>
    <guid isPermaLink="false">http://blog.kimuradb.com/?eid=817213</guid>
    <link>http://blog.kimuradb.com/?eid=817213</link>
    <description>

一日目はセミナーを行わせていただきました。ざっくりWorkbenchは上記Flashでお楽しみください。</description>
    <content:encoded><![CDATA[<br />
<br />
一日目はセミナーを行わせていただきました。ざっくりWorkbenchは上記Flashでお楽しみください。<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22052&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22052&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Fri, 30 Oct 2009 12:28:27 +0000</pubDate>
    <dc:creator>MeijiK</dc:creator>
    <category>MySQL</category>
  </item>

  <item>
    <title>[MySQL][Spider]Spider-2.7リリース</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-1243249875644802246.post-8628662283418159585</guid>
    <link>http://wild-growth-ja.blogspot.com/2009/10/mysqlspiderspider-27.html</link>
    <description>Spiderストレージエンジンのバージョン 2.7(beta)をリリースしました。Spiderストレージエンジンは、database sharding用のストレージエンジンです。http://spiderformysql.com/今回の主な変更は以下です。・１Spiderテーブルに付き、複数リンクを生成し、ロックなし参照時にロードバランスするようになりました。ロードバランスのルールは((サーバID + スレッドID) % リンク数)で決定されます。　複数リンクを生成するには、「host」「user」「table」「server」「socket」「wrapper」「database」「password」のテーブルパラメータを記述する際に、半角スペース区切りで複数記述してください。　例：「host 'h1 h2 h3'」今後、SpiderでActive-Activeのクラスタ構成ができるようにするための、機能追加を行っていく予定です。それ以外の変更については、ダウンロードドキュメント中の「99_change_logs.txt」をご確認下さい。</description>
    <content:encoded><![CDATA[Spiderストレージエンジンのバージョン 2.7(beta)をリリースしました。<br />Spiderストレージエンジンは、database sharding用のストレージエンジンです。<br /><a href="http://spiderformysql.com/">http://spiderformysql.com/</a><br /><br />今回の主な変更は以下です。<br />・１Spiderテーブルに付き、複数リンクを生成し、ロックなし参照時にロードバランスするようになりました。ロードバランスのルールは((サーバID + スレッドID) % リンク数)で決定されます。<br />　複数リンクを生成するには、「host」「user」「table」「server」「socket」「wrapper」「database」「password」のテーブルパラメータを記述する際に、半角スペース区切りで複数記述してください。<br />　例：「host 'h1 h2 h3'」<br /><br />今後、SpiderでActive-Activeのクラスタ構成ができるようにするための、機能追加を行っていく予定です。<br /><br />それ以外の変更については、ダウンロードドキュメント中の「99_change_logs.txt」をご確認下さい。<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1243249875644802246-8628662283418159585?l=wild-growth-ja.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21990&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21990&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Thu, 29 Oct 2009 18:28:00 +0000</pubDate>
    <dc:creator>斯波健徳</dc:creator>
    <category>MySQL</category>
    <category>Spider</category>
  </item>

  <item>
    <title>GPLが適用されているソフトウェア＝MySQLのパッチをBSDライセンスでリリースする。</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-1906500952232920237.post-3912693617247541661</guid>
    <link>http://nippondanji.blogspot.com/2009/10/gplmysqlbsd.html</link>
    <description>Googleがリリースしている有名なMySQL 5.0用パッチは、なんとBSDライセンスで提供されている。MySQLは周知の通りGPLでリリースされているが、GPLソフトウェアはその性質上、改変するとそのソフトウェアもGPLでリリースしなければいけない。だったら何故そのパッチをBSDライセンスで提供することが出来るのか？！ホントにそんなこと出来るのか？！Googleは何か間違ってるんじゃないか？！などと疑問に思われることだろう。結論から言うと、Googleは何らライセンスの間違いを犯しているわけではなく、GPLソフトウェアにGPL互換のライセンスでパッチを書くことが出来るのは、GPLの条文そのものにしっかりと書いてあるのである。以下、GPLv2の日本語訳より抜粋。http://sourceforge.jp/projects/opensource/wiki/licenses/GNU_General_Public_License以上の必要条件は全体としての改変された著作物に適用される。著作物の一部が『プログラム』から派生したものではないと確認でき、それら自身別の独立 した著作物であると合理的に考えられるならば、あなたがそれらを別の著作物として分けて頒布する場合、そういった部分にはこの契約書とその条件は適用されない。しかし、あなたが同じ部分を『プログラム』を基にした著作物全体の一部として頒布するならば、全体としての頒布物は、この契約書が課す条件 に従わなければならない。というのは、この契約書が他の契約者に与える許可は『プログラム』丸ごと全体に及び、誰が書いたかは関係なく各部分のすべてを保護するからである。 よって、すべてあなたによって書かれた著作物に対し、権利を主張したりあなたの権利に異議を申し立てることはこの節の意図するところではない。むしろ、その趣旨は『プログラム』を基にした派生物ないし集合著作物の頒布を管理す る権利を行使するということにある。つまり、パッチとしてオリジナルのGPLソフトウェアから完全に切り離された部分に関しては、GPLが適用されないわけである。ただし、そのパッチをGPLソフトウェアに適用するためには、そのパッチはGPL互換のライセンス（例えばBSDライセンスなど）でリリースしなければならない。そして、それをオリジナルのGPLソフトウェアと合体した時点でGPLが適用される。つまり、GPLソフトウェア ＋ BSDLパッチ ＝ 改変されたGPLソフトウェアという関係が成り立つわけである。従って、件のGoogleパッチがBSDLでリリースされているのは、一切問題はないというわけであり、Googleパッチに含まれるソースコードはBSDライセンスで利用することが可能である。なぜ上記のような条項がGPLに盛り込まれているのか？と疑問を持たれることだろう。もし上記の条項がなければ、全ての変更はGPLを適用したソフトウェアで行わなければならず、従って他のライセンスでリリースされた優秀なソフトウェアやライブラリをGPLソフトウェアと組み合わせて利用することが出来ないという事態になってしまう。例えそれがFSFが作成した他のライセンス、例えばLGPLなどを適用したソフトウェアであっても！である。上記の条項があれば、ライセンス上は安全に他のGPL互換のライセンス（BSDライセンスなど）のソフトウェアとGPLライセンスのソフトウェアを組み合わせて別のソフトウェアを開発することが可能になる。まったくもってややこしい話であるが、オープンソースソフトウェアに携わる人間としてライセンスの組み合わせは避けて通ることが出来ない問題であり、数あるオープンソースライセンスの中でも最もシェアが多いのはGPLなので、GPLの互換性に関する知識は身につけておく必要があるだろう。GPLが嫌いな人は「GPL汚染」などと揶揄してとかくGPLソフトウェアに対して脊髄反射的な嫌悪を示すことが多いのだが、それはきっと未知なるものに畏怖の念を抱くのは人間の性だからであり、しっかりライセンスを読んでよく理解すれば何も恐れる必要はないのである。</description>
    <content:encoded><![CDATA[Googleがリリースしている<a href="http://code.google.com/p/google-mysql-tools/wiki/Mysql5Patches">有名なMySQL 5.0用パッチ</a>は、なんとBSDライセンスで提供されている。MySQLは周知の通りGPLでリリースされているが、GPLソフトウェアはその性質上、改変するとそのソフトウェアもGPLでリリースしなければいけない。だ<b>ったら何故そのパッチをBSDライセンスで提供することが出来るのか？！ホントにそんなこと出来るのか？！Googleは何か間違ってるんじゃないか？！</b>などと疑問に思われることだろう。<br /><br /><div>結論から言うと、Googleは何らライセンスの間違いを犯しているわけではなく、GPLソフトウェアにGPL互換のライセンスでパッチを書くことが出来るのは、GPLの条文そのものにしっかりと書いてあるのである。<br /></div><div><br /></div><div>以下、GPLv2の日本語訳より抜粋。<br /></div><div><a href="http://sourceforge.jp/projects/opensource/wiki/licenses/GNU_General_Public_License">http://sourceforge.jp/projects/opensource/wiki/licenses/GNU_General_Public_License</a><br /></div><div>以上の必要条件は全体としての改変された著作物に適用される。著作物の一部が『プログラム』から派生したものではないと確認でき、それら自身別の独立 した著作物であると合理的に考えられるならば、あなたがそれらを別の著作物として分けて頒布する場合、そういった部分にはこの契約書とその条件は適用されない。しかし、あなたが同じ部分を『プログラム』を基にした著作物全体の一部として頒布するならば、全体としての頒布物は、この契約書が課す条件 に従わなければならない。というのは、この契約書が他の契約者に与える許可は『プログラム』丸ごと全体に及び、誰が書いたかは関係なく各部分のすべてを保護するからである。 よって、すべてあなたによって書かれた著作物に対し、権利を主張したりあなたの権利に異議を申し立てることはこの節の意図するところではない。むしろ、その趣旨は『プログラム』を基にした派生物ないし集合著作物の頒布を管理す る権利を行使するということにある。<br /></div><div><br /></div><div>つまり、パッチとしてオリジナルのGPLソフトウェアから完全に切り離された部分に関しては、GPLが適用されないわけである。ただし、そのパッチをGPLソフトウェアに適用するためには、そのパッチはGPL互換のライセンス（例えばBSDライセンスなど）でリリースしなければならない。そして、それをオリジナルのGPLソフトウェアと合体した時点でGPLが適用される。つまり、<br /></div><div><br /></div><div><span><b>GPLソフトウェア ＋ BSDLパッチ ＝ 改変されたGPLソフトウェア</b></span><br /></div><div><br /></div><div>という関係が成り立つわけである。従って、件のGoogleパッチがBSDLでリリースされているのは、一切問題はないというわけであり、Googleパッチに含まれるソースコードはBSDライセンスで利用することが可能である。<br /><br />なぜ上記のような条項がGPLに盛り込まれているのか？と疑問を持たれることだろう。もし上記の条項がなければ、全ての変更はGPLを適用したソフトウェアで行わなければならず、従って他のライセンスでリリースされた優秀なソフトウェアやライブラリをGPLソフトウェアと組み合わせて利用することが出来ないという事態になってしまう。例えそれがFSFが作成した他のライセンス、例えばLGPLなどを適用したソフトウェアであっても！である。上記の条項があれば、ライセンス上は安全に他のGPL互換のライセンス（BSDライセンスなど）のソフトウェアとGPLライセンスのソフトウェアを組み合わせて別のソフトウェアを開発することが可能になる。<br /></div><div><br /></div><div>まったくもってややこしい話であるが、オープンソースソフトウェアに携わる人間としてライセンスの組み合わせは避けて通ることが出来ない問題であり、数あるオープンソースライセンスの中でも最もシェアが多いのはGPLなので、GPLの互換性に関する知識は身につけておく必要があるだろう。GPLが嫌いな人は「GPL汚染」などと揶揄してとかくGPLソフトウェアに対して脊髄反射的な嫌悪を示すことが多いのだが、それはきっと未知なるものに畏怖の念を抱くのは人間の性だからであり、しっかりライセンスを読んでよく理解すれば何も恐れる必要はないのである。<br /></div><div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1906500952232920237-3912693617247541661?l=nippondanji.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21988&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21988&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Thu, 29 Oct 2009 17:21:00 +0000</pubDate>
    <dc:creator>Mikiya Okuno</dc:creator>
    <category>mysql</category>
    <category>gpl</category>
  </item>

  <item>
    <title>(特にMyISAMを使っていた)ウェブ屋さんがInnoDBを使う場合の設定項目</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/kazuhooku/20091029/1256775791</guid>
    <link>http://d.hatena.ne.jp/kazuhooku/20091029/1256775791</link>
    <description>
			InnoDBはMyISAMと比較して安全(OSクラッシュや電源断が発生してもテーブルが壊れない)分、書き込みが遅い。データベース屋さんからすると、それは当然のことでMyISAMがおかしいんだ、ということになり、だからバッテリバックアップ機能のついたRAIDカードを使うんだ、という話になる。でも、MyISAMを使っているウェブ屋さんの現場では、場合によって多少データが消えてもかまわないから、安いハードウェアで大量のアクセスを捌きたい... って乖離があるんじゃないかなーと思ってる。
			そのような場合には、my.cnf の innodb_flush_log_at_trx_commit パラメータを調整することで、MyISAMに比肩する書き込み速度を得ることができる(そのかわり、クラッシュや電源断の場合は、設定によって直近１秒以内の変更が失われる)。
			他のパラメータも含めて書いておくと、データベース専用サーバ (on linux) の場合は、

&amp;#91;mysqld]
...
innodb_buffer_pool_size=3072M     # innodbに割り振るメモリ。実メモリの75%程度
innodb_log_buffer_size=256M       # あまり大きくしても意味がないような気がする...
innodb_flush_log_at_trx_commit=0  # 毎秒１回データをディスクに書き出し
innodb_flush_method=O_DIRECT
innodb_file_per_table
...


			あたりが自分の好み。/etc/sysctl.conf も編集して、

vm.swappiness = 5


			とか書いておくと、InnoDBのバッファプールがスワップアウトされる可能性が減って幸せになれる（ことがあるかも）。
			linux 以外、あるいは Apache と同居させるような小規模な運用では、O_DIRECT せずに

innodb_buffer_pool_size=512M      # 実メモリの10-20%?
innodb_log_buffer_size=128M
innodb_flush_log_at_trx_commit=0
innodb_file_per_table


			として、OSのバッファキャッシュを使うという手もあると思う。そんなにいっぱいデータベース立てた経験ないけど、ベストプラクティスがどのあたりなのか興味があるので、あえて書いてみた。
			

			なお、SATA HDDを使ってるようなケースでは、

% sudo hdparm -W 0 /dev/sda  # 必要なら sdb や sdc も。


			して、ディスクの書き込みバッファを無効化しておく必要がある（そうでないと電源断時にデータが壊れる）。これはデータベースソフトウェアに限らない話だけど。
			

			参考:
			Open database life: MyISAMとInnoDBのどちらを使うべきか
			MySQL ::   MySQL 5.1 リファレンスマニュアル :: 13.5.4 InnoDB 起動オプションとシステム変数
			MySQL5開拓団 - ストレージエンジンの吟味 (2) / KLab株式会社
			Red Hat Knowledgebase:  システムがメモリのキャッシュやバッファを解放せずにデータをスワップするのはなぜですか？ 
		</description>
    <content:encoded><![CDATA[<div>
			<p>InnoDBはMyISAMと比較して安全(OSクラッシュや電源断が発生してもテーブルが壊れない)分、書き込みが遅い。データベース屋さんからすると、それは当然のことでMyISAMがおかしいんだ、ということになり、だからバッテリバックアップ機能のついたRAIDカードを使うんだ、という話になる。でも、MyISAMを使っているウェブ屋さんの現場では、場合によって多少データが消えてもかまわないから、安いハードウェアで大量のアクセスを捌きたい... って乖離があるんじゃないかなーと思ってる。</p>
			<p>そのような場合には、my.cnf の innodb_flush_log_at_trx_commit パラメータを調整することで、MyISAMに比肩する書き込み速度を得ることができる(そのかわり、クラッシュや電源断の場合は、設定によって直近１秒以内の変更が失われる)。</p>
			<p>他のパラメータも含めて書いておくと、データベース専用サーバ (on linux) の場合は、</p>
<pre>
&#91;mysqld]
...
innodb_buffer_pool_size=3072M     # innodbに割り振るメモリ。実メモリの75%程度
innodb_log_buffer_size=256M       # あまり大きくしても意味がないような気がする...
innodb_flush_log_at_trx_commit=0  # 毎秒１回データをディスクに書き出し
innodb_flush_method=O_DIRECT
innodb_file_per_table
...
</pre>

			<p>あたりが自分の好み。/etc/sysctl.conf も編集して、</p>
<pre>
vm.swappiness = 5
</pre>

			<p>とか書いておくと、InnoDBのバッファプールがスワップアウトされる可能性が減って幸せになれる（ことがあるかも）。</p>
			<p>linux 以外、あるいは Apache と同居させるような小規模な運用では、O_DIRECT せずに</p>
<pre>
innodb_buffer_pool_size=512M      # 実メモリの10-20%?
innodb_log_buffer_size=128M
innodb_flush_log_at_trx_commit=0
innodb_file_per_table
</pre>

			<p>として、OSのバッファキャッシュを使うという手もあると思う。そんなにいっぱいデータベース立てた経験ないけど、ベストプラクティスがどのあたりなのか興味があるので、あえて書いてみた。</p>
			<br>

			<p>なお、SATA HDDを使ってるようなケースでは、</p>
<pre>
% sudo hdparm -W 0 /dev/sda  # 必要なら sdb や sdc も。
</pre>

			<p>して、ディスクの書き込みバッファを無効化しておく必要がある（そうでないと電源断時にデータが壊れる）。これはデータベースソフトウェアに限らない話だけど。</p>
			<br>

			<p>参考:</p>
			<p><a href="http://opendatabaselife.blogspot.com/2009/10/myisaminnodb.html" target="_blank">Open database life: MyISAMとInnoDBのどちらを使うべきか</a></p>
			<p><a href="http://dev.mysql.com/doc/refman/5.1/ja/innodb-parameters.html" target="_blank">MySQL ::   MySQL 5.1 リファレンスマニュアル :: 13.5.4 InnoDB 起動オプションとシステム変数</a></p>
			<p><a href="http://www.klab.jp/media/mysql/index3.html" target="_blank">MySQL5開拓団 - ストレージエンジンの吟味 (2) / KLab株式会社</a></p>
			<p><a href="http://kbase.redhat.com/faq/docs/DOC-18229" target="_blank">Red Hat Knowledgebase:  システムがメモリのキャッシュやバッファを解放せずにデータをスワップするのはなぜですか？ </a></p>
		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21983&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21983&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Thu, 29 Oct 2009 00:23:11 +0000</pubDate>
    <dc:creator>Kazuho Oku</dc:creator>
  </item>

  <item>
    <title>MySQLerのTwitterアカウントまとめ。</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-1906500952232920237.post-828746493839010520</guid>
    <link>http://nippondanji.blogspot.com/2009/10/mysqlertwitter.html</link>
    <description>松信氏の、MyISAMとInnoDBのどちらを使うべきかTwitterで話題になってたので簡単にまとめました。というエントリが人気を博しているが、松信氏が言うように最近はTwitterでMySQL関連の話題も結構増えてきているように思う。Twitterの流行の勢いは凄まじく、今は右を向いても左を向いてもTwitter、寝ても覚めてもTwitter、猫も杓子もTwitterという雰囲気である。従ってMySQLもTwitterで盛り上がるのは当然の成り行きというもであるし、Twitterを活用しない手はない。しかしMySQL関連の話で盛り上がると言っても「じゃあ誰をフォローすれば話に入れるんだよ？！」と多くの皆さんは疑問に思われることだろう。そこで、今日はMySQL関連のTwitterアカウントを独断と偏見と愛と勇気と努力をもって紹介する。MySQLの情報が欲しい人、もしくは話題の輪に入ってみたい人はぜひフォローして頂きたい。まずはオフィシャルなアカウント関係から。オフィシャルなアカウントメッセージを一方的に発信するだけなので、話題に入るのではなく、情報源として、つまりRT（Re−Tweet）の対象として活用して頂きたい。@mysql基本中の基本。新しいリリースやWebinarの告知などが行われる。特にバージョンアップによる新機能の追加は、話のネタには持ってこいなのでMySQLerは必ずフォローしよう。@mysql_jpMySQL公式日本語アカウント。国内で行われるイベントやセミナーの告知とかがされる模様。2009年11月13日オープン！@planetmysql_jpこちらもMySQLerフォロー必須のアカウントである。コレはPlanet MySQL日本語版のフィードを呟くボットアカウントで、Planet MySQL日本語版に登録されているブログに記事が投稿される度にフィードを読み取って呟いてくれる。ブログ記事にツッコミを入れたりコメントしたり友人に広めたりするのに持ってこいだろう。なお、MySQL関連のブログを書いている人は是非Planet MySQLに登録しよう。ブログは見る人が居てナンボであるが、Planet MySQLに登録することでより多くの人に見て貰える機会が増えるからである。MySQLブロガーがPlanet MySQLに登録し、MySQLer全員がそのRSSを購読したり@planetmysql_jpをフォローすれば品質の高い情報交換が出来るようになるだろう。関連リンクPlanet MySQL日本語版 http://jp.planet.mysql.com/@planetmysqlこちらはPlanet MySQL英語版のボットアカウントである。英語が堪能なら是非こちらのアカウントもフォローしよう。英語圏におけるMySQLブログ記事の投稿数は相当なものであり、非常に質の高い情報が飛び交っている。英語の練習にもどうぞ。関連リンクPlanet MySQL英語版 http://planet.mysql.com/では続いて日本人MySQLerのアカウントを紹介しよう。友好的な人が多いので、気軽にフォローして突っ込んでみて頂きたい。@tmtms言わずと知れたとみた まさひろ氏。MyNAの会長にして日本最古参MySQLerのひとり。MySQL徹底入門の著者、MySQLにおける日本語文字コードの初期実装、なおかつ超^128重要なモジュールであるMySQL/Rubyの開発者としても知られる偉人である。（しかし本人は奇策・・・もとい気さくなひと）Rubykaigi 2009では「MySQL/Ruby終了のお知らせ」という楽しいプレゼンをして話題を呼んだ。これからはPure-Ruby実装であるRuby/MySQLを継続されるそうなので頑張って頂きたい。関連リンクMySQL/Ruby&amp;nbsp;http://www.tmtm.org/en/mysql/ruby/README_ja.htmlRuby/MySQL&amp;nbsp;http://www.tmtm.org/ja/ruby/mysql/README.htmlMySQL/Ruby終了のお知らせ http://www.slideshare.net/tmtm/mysqlrubyしあわせプログラマ http://d.hatena.ne.jp/tmtms/@sakaikMyNAのMLでおなじみの坂井氏。MySQL 徹底入門 第2版や、その他数多くのMySQL関連書籍の共著者として知られる。関連リンクsakaikの日々雑感～(C)編 http://d.hatena.ne.jp/sakaik/@ikdttrMySQLにおいて日本語フルテキストインデックスを使った検索を可能とする「Sennaストレージエンジン」の開発者である池田氏。最近はMySQL 5.1対応版の開発に忙しいらしい。早くでないかと心待ちにする毎日である。池田氏をフォローしたら「リリースマダー？」と呟くのを忘れてはならない。関連リンクTritonnプロジェクト http://qwik.jp/tritonn/mir the developer http://d.hatena.ne.jp/mir/@hirohama日本におけるMySQL Clusterの第一人者にして実力者の廣濱氏。カメラ好き、ガジェット好き、女好き^H^H^H^H。MySQL Clusterについて語ることの出来る貴重な人材である。関連リンクhirohama.mysql http://www.hirohama.biz/mysql/@kazuho天才エンジニアとして国際的な評価も高いサイボウズ・ラボの奥一穂氏。Q4Mストレージエンジン、Pacificドライバなど秀逸なソフトウェアを世に送り出している。ツッコミも的確で示唆的である。しかしそれでいて茶目っ気を忘れないというのが心憎い。関連リンクKazuho@Cybozu Labs http://developer.cybozu.co.jp/kazuho/コンピュータは想像力を刺激する 奥一穂さんのエンジニアライフ&amp;nbsp;http://okyuu.com/ja/special/engineer07-kazuho彼氏がMyISAMを使ってた。別れたい... http://d.hatena.ne.jp/kazuhooku/20091027Q4M http://q4m.31tools.com/Pacificという名前の分散ストレージを作り始めた件 http://developer.cybozu.co.jp/kazuho/2009/06/pacific-18c7.html@yonekawaサイボウズ株式会社の米川氏。サイボウズはMySQLを利用するプロプラエタリソフトウェアの代表格である。関連リンクHappy Software Development http://yonekawa.livejournal.com/サイボウズ 職種別 社員インタビュー 開発本部 開発部 米川健一&amp;nbsp;http://cybozu.co.jp/company/job/recruitment/voice/11yonekawa.html@sh2ndOracleおよびInnoDBのエキスパート平塚氏。ブログでは度々気合いの入ったベンチマークなどをしてくれるのでwktk度高し。Rethink DBを真っ先に試すなど、人柱としても秀逸である。関連リンクSH2の日記 http://d.hatena.ne.jp/sh2/MySQL RethinkDB 0.1 試してみました http://d.hatena.ne.jp/sh2/20090916@kentokushibaスパイダーマンこと斯波氏。SPIDERストレージエンジンの開発者として有名である。最近はVertical Partitioningエンジン（カラムごとにパーティショニングをするタイプのストレージエンジン）の開発も精力的に行っている。関連リンクWild Growth日本語版 http://wild-growth-ja.blogspot.com/SPIDER for MySQL http://spiderformysql.com/Vertical Partitioning for MySQL&amp;nbsp;http://launchpad.net/vpformysql@kazeburo大規模分散野郎Aチーム。Mixiの長野氏。Mixiのインフラを支える職人的DBAである。関連リンク横浜から渋谷方面に通勤するWeb EngineerのBlog http://blog.nomadscafe.jp/インフラエンジニア検討会2008 mixiや楽天の「中の人」、インフラエンジニアを語る http://www.atmarkit.co.jp/news/200812/08/infla.htmlmixi Engineer's Blog&amp;nbsp;http://alpha.mixi.co.jp/blog/@tmaesakaMixiの前坂氏。Drizzleやmemcachedなどのプロジェクトにおいて精力的に活動している。長きにわたりニュージーランドに在住しているため英語はペラペラである。最近はTokyo Cabinetにデータを格納するDrizzle用ストレージエンジンであるBlitzDBの開発に勤しんでいる。関連リンクオープンソースの活動「すごく、いい」 前坂徹さんのエンジニアライフ http://okyuu.com/ja/special/engineer08-tmaesaka前坂氏のブログ（英語） http://torum.net/バイリンガルの独り言 http://ja.torum.net/BlitzDB https://launchpad.net/blitzdbDrizzle https://launchpad.net/drizzlememcached http://www.danga.com/memcached@stanakaとあるはてな社員こと田中氏。はてなを果てしなくスケーリング（注：ダジャレではありません。）関連リンクとあるはてな社員の日記 http://d.hatena.ne.jp/stanaka/@tokuhiromえとらぼ松野氏。だまってコードを書く人。関連リンクTokuLog 改めB日記 http://d.hatena.ne.jp/tokuhirom/広がれエンジニアの輪 第2回 松野徳大 -- 「だまってコードを書けよ」&amp;nbsp;http://jibun.atmarkit.co.jp/lcom01/rensai/comrade02/comrade01.html@hirose31えとらぼのひろせまさあき氏。ブログのネタはいつも秀逸。関連リンク(ひ)メモ http://d.hatena.ne.jp/hirose31/「ブラックボックスは不安でしょ」　ひろせまさあきさんのエンジニアライフ http://okyuu.com/ja/special/特集_No_okyuu_No_Life_第3回@ichii386GREEの一井氏。InnoDBラブなMySQLerが多い中で異色のMyISAMラヴ!!な逸材。一井氏曰く、分析計の処理にはMyISAMの取り回しの手軽さが便利とのこと。関連リンクいちいの日記 http://d.hatena.ne.jp/ichii386/Ethna×PHP (LLフレームワークBOOKS)お次はMySQLの中の人。まずは日本人から。@matsunobu言わずと知れたMySQLのコンサルタント松信氏。数多くの書籍を執筆し、印税でウハウハしているMySQLの普及に大きく貢献している。最近受けたOkyuu.comのインタビュー記事では、「夢はエンジニアに強い影響を与える本を書くこと」と述べているのは感心する志である。この調子でこれからも頑張って頂きたい。関連リンク夢はエンジニアに強い影響を与える本を書くこと　松信嘉範さんのエンジニアライフ http://okyuu.com/ja/special/engineer09-matsunobuOpen Database Life http://opendatabaselife.blogspot.com/@rkajiyamaトレーナーから技術支援まで幅広くこなすタフガイ梶山氏。日本語の（Webを含む）セミナーやイベントではまず梶山氏が登場するので、ご存じの方も多いのではないだろうか。APAC地域担当であるため、かなりの期間を海外で過ごしている。@meijik同じMySQLサポートエンジニアにしてキムラデービー代表の木村氏。カレーが大好きで、ランチはカレー率が非常に高い。ブログにもカレーの記事が満載である。たまにDB Magazine等の雑誌に記事を投稿している。また、OSS RDBMSとしてはMySQLだけでなくFirebird関連の活動も活発に行っている。現在Firebird（徹底）入門書籍執筆中。関連リンクキムラデービーブログ http://blog.kimuradb.com適材適所のデータベース選択が重要--Firebird日本ユーザー会 http://japan.zdnet.com/sp/interview/story/0,2000056426,20354736,00.htm@nippondanjiいわゆる俺。フォロー歓迎。続いて英語圏の中の人たち。英語が堪能ならぜひフォローを。@brianakerOSSの申し子Brian Aker氏。MySQLの各種ストレージエンジン（FEDERATED、ARCHIVE、Blackhole）、memcached、Drizzle、Gearmanなど、様々な実績を残している天才プログラマである。使用しているエディタはvim。MySQLに入社する条件として「絶対にノベルティのTシャツは着ない」というものを提示した頑固者。彼の語り口は非常にマイルドで、それでいて常に論理的である。Aker氏は尊子Richard Stallmanとディベートを行ったのだが、尊子よりも主張が論理的ですらあるように感じてしまうから驚きである。俺は二人とも大好きだ！関連リンクBRIAN AKER DEBATES WITH RICHARD STALLMAN http://www.bytebot.net/blog/archives/2009/10/25/brian-aker-debates-with-richard-stallmanBrian &quot;Krow&quot; Aker's Idle Thoughts http://krow.livejournal.com/@stewartsmith元MySQL Clusterの開発者にして、Drizzleの開発者Stewart Smith氏。写真ではオッサンっぽく見える場合もあるが実は結構若い。もちろん技術的にはエキスパートであり、彼のブログでは度々参考になる情報が掲載されているから見逃せない。関連リンクRamblings http://www.flamingspork.com/blog/@kajarnoMySQLコミュニティ担当副社長のKaj Arno氏。MySQLのスポークスパーソン的存在。MySQL ABがコミュニティと良好な関係を保ってこられたのは彼の功績によるところが大きい。Bad Newsを魔法のようにGood Newsに変えるともっぱらの噂である。関連リンクブログ http://blogs.mysql.com/kaj/@datacharmerMySQLコミュニティ担当のGiuseppe Maxia氏。Datacharmerというのは彼のニックネーム。ジュゼッペ氏はMySQL::Sandboxの作者としても知られる。MySQL::Sandboxは相当便利なので使うべし！関連リンクブログ http://datacharmer.blogspot.com/MySQL::Sandbox http://mysqlsandbox.net/@LenzGr同じくMySQLコミュニティ担当のLenz Grimmer氏。Planet MySQLを管理しているのは彼である。さらに中の人を紹介するが、以下はサポートチームの面々である。詳しい説明は省略する。@maximuscub俺の上司のLachlan。若くてマッチョなオーストラリア人。@adamtdixonAPAC地区でMySQL Clusterを担当しているAdam。@geertjanvdkEMEA地区でMySQL Clusterを担当しているGeert。@lathiat見たまんまギークなTrent。かなりの早口なので、脳をオーバークロックしている疑いが持たれている。@garypendergast長期休暇取得中のGary。今はイタリアを放浪しているらしい。しかし仕事はチョッパ。以下はその他の英語圏のMySQL関連アカウント。@jzawodn誉れ高き名著「High Performance MySQL」の著者、Jeremy Zawodny氏。元米Yahoo!のDBA。MySQLのレプリケーションで参照系の負荷を分散できる！ということを、実際のシステムで証明して見せたのは彼が最初ではないだろうか。関連リンクブログ http://jeremy.zawodny.com/blog/@martenmickos元MySQL ABのCEO、Marten Mickos氏。MySQLは技術者集団だが、Mickos氏は経営のプロ。惜しい人物を放出したものである。@launchpad_netMySQLの公開リポジトリをホスティングしているLaunchpadの公式アカウント。関連リンクLaunchpad http://launchpad.net/@KickfireMySQLを用いたDWHアプライアンスを販売している米Kickfire社の公式アカウント。KickfireはDWH用のストレージエンジンであるが、興味深いのは「SQLチップ」なるものを用いた専用のハードウェアで動作するるところ。汎用CPUでは達成できない性能を叩き出す。関連リンクKickfire&amp;nbsp;http://www.kickfire.com/@webyogMySQLのGUIを販売するWebyog社のアカウント。関連リンクWebyog http://www.webyog.com/@PerconaMySQL Performance Blogでお馴染みのPercona社のアカウント。InnoDBの達人である木下氏が所属する会社でもある。（木下氏はPercona社にてXtraDBやXtraBackupの開発に勤しんでいる。オトコ的には木下氏にも呟いて貰いたいところである。）関連リンクPercona http://www.percona.com/MySQL Performance Blog http://www.mysqlperformanceblog.com/DB改造屋雑記 http://buildup-db.blogspot.com/というわけで、思いつくままにMySQLerなTwitterアカウントを並べてみたが、是非皆さんも彼らをフォローしてみて頂きたい。データベースを開発や運用でどう上手に使いこなすかということは、システム屋ないしはWeb系のエンジニアにとって非常に重要な課題である。Twitterを活用して情報を仕入れたりディスカッションに参加したりして、ぜひスキルアップに役立てて貰いたいものである。ここに挙げたアカウントはほんの一部であることを断っておく。実際にはまだまだこんなものではなくもっと大勢の優秀なMySQLerが存在する。もし、「この人が抜けてるだろ！」とか「俺も載せろ！」という方がいらっしゃったら、Twitterで@nippondanjiへこっそりとダイレクトメッセージを送って頂きたい。</description>
    <content:encoded><![CDATA[松信氏の、<br /><br /><blockquote><span><b><a href="http://opendatabaselife.blogspot.com/2009/10/myisaminnodb.html">MyISAMとInnoDBのどちらを使うべきか</a><br /></b></span>Twitterで話題になってたので簡単にまとめました。<br /></blockquote><br />というエントリが人気を博しているが、松信氏が言うように最近はTwitterでMySQL関連の話題も結構増えてきているように思う。Twitterの流行の勢いは凄まじく、今は右を向いても左を向いてもTwitter、寝ても覚めてもTwitter、猫も杓子もTwitterという雰囲気である。従ってMySQLもTwitterで盛り上がるのは当然の成り行きというもであるし、Twitterを活用しない手はない。<br /><br />しかしMySQL関連の話で盛り上がると言っても<b>「じゃあ誰をフォローすれば話に入れるんだよ？！」</b>と多くの皆さんは疑問に思われることだろう。そこで、今日はMySQL関連のTwitterアカウントを独断と偏見と愛と勇気と努力をもって紹介する。MySQLの情報が欲しい人、もしくは話題の輪に入ってみたい人はぜひフォローして頂きたい。<br /><br />まずはオフィシャルなアカウント関係から。オフィシャルなアカウントメッセージを一方的に発信するだけなので、話題に入るのではなく、情報源として、つまりRT（Re−Tweet）の対象として活用して頂きたい。<br /><br /><b><span><a href="http://twitter.com/mysql">@mysql</a></span></b><br /><br />基本中の基本。新しいリリースやWebinarの告知などが行われる。特にバージョンアップによる新機能の追加は、話のネタには持ってこいなのでMySQLerは必ずフォローしよう。<br /><br /><a href="http://twitter.com/mysql_jp"><b><span>@mysql_jp</span></b></a><br /><br />MySQL公式日本語アカウント。国内で行われるイベントやセミナーの告知とかがされる模様。2009年11月13日オープン！<br /><br /><b><a href="http://twitter.com/planetmysql_jp"><span>@planetmysql_jp</span></a></b><br /><br />こちらもMySQLerフォロー必須のアカウントである。コレはPlanet MySQL日本語版のフィードを呟くボットアカウントで、Planet MySQL日本語版に登録されているブログに記事が投稿される度にフィードを読み取って呟いてくれる。ブログ記事にツッコミを入れたりコメントしたり友人に広めたりするのに持ってこいだろう。<br /><br />なお、MySQL関連のブログを書いている人は是非Planet MySQLに登録しよう。ブログは見る人が居てナンボであるが、Planet MySQLに登録することでより多くの人に見て貰える機会が増えるからである。MySQLブロガーがPlanet MySQLに登録し、MySQLer全員がそのRSSを購読したり@planetmysql_jpをフォローすれば品質の高い情報交換が出来るようになるだろう。<br /><br /><b>関連リンク</b><br /><ul><li>Planet MySQL日本語版 <a href="http://jp.planet.mysql.com/">http://jp.planet.mysql.com/</a></li></ul><br /><b><a href="http://twitter.com/planetmysql"><span>@planetmysql</span></a></b><br /><br />こちらはPlanet MySQL英語版のボットアカウントである。英語が堪能なら是非こちらのアカウントもフォローしよう。英語圏におけるMySQLブログ記事の投稿数は相当なものであり、非常に質の高い情報が飛び交っている。英語の練習にもどうぞ。<br /><br /><b>関連リンク</b><br /><ul><li>Planet MySQL英語版 <a href="http://planet.mysql.com/">http://planet.mysql.com/</a></li></ul><br />では続いて日本人MySQLerのアカウントを紹介しよう。友好的な人が多いので、気軽にフォローして突っ込んでみて頂きたい。<br /><br /><b><span><a href="http://twitter.com/tmtms">@tmtms</a></span></b><br /><br />言わずと知れた<b>とみた まさひろ</b>氏。MyNAの会長にして日本最古参MySQLerのひとり。MySQL徹底入門の著者、MySQLにおける日本語文字コードの初期実装、なおかつ超^128重要なモジュールであるMySQL/Rubyの開発者としても知られる偉人である。（しかし本人は奇策・・・もとい気さくなひと）Rubykaigi 2009では<b>「MySQL/Ruby終了のお知らせ」</b>という楽しいプレゼンをして話題を呼んだ。これからはPure-Ruby実装であるRuby/MySQLを継続されるそうなので頑張って頂きたい。<br /><br /><span></span><br /><b>関連リンク</b><br /><ul><li>MySQL/Ruby&nbsp;<a href="http://www.tmtm.org/en/mysql/ruby/README_ja.html">http://www.tmtm.org/en/mysql/ruby/README_ja.html</a></li><li>Ruby/MySQL&nbsp;<a href="http://www.tmtm.org/ja/ruby/mysql/README.html">http://www.tmtm.org/ja/ruby/mysql/README.html</a></li><li>MySQL/Ruby終了のお知らせ <a href="http://www.slideshare.net/tmtm/mysqlruby">http://www.slideshare.net/tmtm/mysqlruby</a></li><li>しあわせプログラマ <a href="http://d.hatena.ne.jp/tmtms/">http://d.hatena.ne.jp/tmtms/</a></li></ul><br /><b><span><a href="http://twitter.com/sakaik">@sakaik</a></span></b><br /><br />MyNAのMLでおなじみの坂井氏。MySQL 徹底入門 第2版や、その他数多くのMySQL関連書籍の共著者として知られる。<br /><br /><b>関連リンク</b><br /><ul><li>sakaikの日々雑感～(C)編 <a href="http://d.hatena.ne.jp/sakaik/">http://d.hatena.ne.jp/sakaik/</a></li></ul><br /><b><span><a href="http://twitter.com/ikdttr">@ikdttr</a></span></b><br /><br />MySQLにおいて日本語フルテキストインデックスを使った検索を可能とする「Sennaストレージエンジン」の開発者である池田氏。最近はMySQL 5.1対応版の開発に忙しいらしい。早くでないかと心待ちにする毎日である。池田氏をフォローしたら「リリースマダー？」と呟くのを忘れてはならない。<br /><br /><b>関連リンク</b><br /><ul><li>Tritonnプロジェクト <a href="http://qwik.jp/tritonn/">http://qwik.jp/tritonn/</a></li><li>mir the developer <a href="http://d.hatena.ne.jp/mir/">http://d.hatena.ne.jp/mir/</a></li></ul><br /><b><span><a href="http://twitter.com/hirohama">@hirohama</a></span></b><br /><br />日本におけるMySQL Clusterの第一人者にして実力者の廣濱氏。カメラ好き、ガジェット好き、女好き^H^H^H^H。MySQL Clusterについて語ることの出来る貴重な人材である。<br /><br /><b>関連リンク</b><br /><ul><li>hirohama.mysql <a href="http://www.hirohama.biz/mysql/">http://www.hirohama.biz/mysql/</a></li></ul><br /><b><span><a href="http://twitter.com/kazuho">@kazuho</a></span></b><br /><br />天才エンジニアとして国際的な評価も高いサイボウズ・ラボの奥一穂氏。Q4Mストレージエンジン、Pacificドライバなど秀逸なソフトウェアを世に送り出している。ツッコミも的確で示唆的である。しかしそれでいて茶目っ気を忘れないというのが心憎い。<br /><br /><b>関連リンク</b><br /><ul><li>Kazuho@Cybozu Labs <a href="http://developer.cybozu.co.jp/kazuho/">http://developer.cybozu.co.jp/kazuho/</a></li><li>コンピュータは想像力を刺激する 奥一穂さんのエンジニアライフ&nbsp;<a href="http://okyuu.com/ja/special/engineer07-kazuho">http://okyuu.com/ja/special/engineer07-kazuho</a></li><li>彼氏がMyISAMを使ってた。別れたい... <a href="http://d.hatena.ne.jp/kazuhooku/20091027">http://d.hatena.ne.jp/kazuhooku/20091027</a></li><li>Q4M <a href="http://q4m.31tools.com/">http://q4m.31tools.com/</a></li><li>Pacificという名前の分散ストレージを作り始めた件 <a href="http://developer.cybozu.co.jp/kazuho/2009/06/pacific-18c7.html">http://developer.cybozu.co.jp/kazuho/2009/06/pacific-18c7.html</a></li></ul><br /><b><span><a href="http://twitter.com/yonekawa">@yonekawa</a></span></b><br /><br />サイボウズ株式会社の米川氏。サイボウズはMySQLを利用するプロプラエタリソフトウェアの代表格である。<br /><br /><b>関連リンク</b><br /><ul><li>Happy Software Development <a href="http://yonekawa.livejournal.com/">http://yonekawa.livejournal.com/</a></li><li>サイボウズ 職種別 社員インタビュー 開発本部 開発部 米川健一&nbsp;<a href="http://cybozu.co.jp/company/job/recruitment/voice/11yonekawa.html">http://cybozu.co.jp/company/job/recruitment/voice/11yonekawa.html</a></li></ul><br /><b><span><a href="http://twitter.com/sh2nd">@sh2nd</a></span></b><br /><br />OracleおよびInnoDBのエキスパート平塚氏。ブログでは度々気合いの入ったベンチマークなどをしてくれるのでwktk度高し。Rethink DBを真っ先に試すなど、人柱としても秀逸である。<br /><br /><b>関連リンク</b><br /><ul><li>SH2の日記 <a href="http://d.hatena.ne.jp/sh2/">http://d.hatena.ne.jp/sh2/</a></li><li>MySQL RethinkDB 0.1 試してみました <a href="http://d.hatena.ne.jp/sh2/20090916">http://d.hatena.ne.jp/sh2/20090916</a></li></ul><br /><b><span><a href="http://twitter.com/kentokushiba">@kentokushiba</a></span></b><br /><br />スパイダーマンこと斯波氏。SPIDERストレージエンジンの開発者として有名である。最近はVertical Partitioningエンジン（カラムごとにパーティショニングをするタイプのストレージエンジン）の開発も精力的に行っている。<br /><br /><b>関連リンク</b><br /><ul><li>Wild Growth日本語版 <a href="http://wild-growth-ja.blogspot.com/">http://wild-growth-ja.blogspot.com/</a></li><li>SPIDER for MySQL <a href="http://spiderformysql.com/">http://spiderformysql.com/</a></li><li>Vertical Partitioning for MySQL&nbsp;<a href="http://launchpad.net/vpformysql">http://launchpad.net/vpformysql</a></li></ul><br /><b><span><a href="http://twitter.com/kazeburo">@kazeburo</a></span></b><br /><br />大規模分散野郎Aチーム。Mixiの長野氏。Mixiのインフラを支える職人的DBAである。<br /><br /><b>関連リンク</b><br /><ul><li>横浜から渋谷方面に通勤するWeb EngineerのBlog <a href="http://blog.nomadscafe.jp/">http://blog.nomadscafe.jp/</a></li><li>インフラエンジニア検討会2008 mixiや楽天の「中の人」、インフラエンジニアを語る <a href="http://www.atmarkit.co.jp/news/200812/08/infla.html">http://www.atmarkit.co.jp/news/200812/08/infla.html</a></li><li>mixi Engineer's Blog&nbsp;<a href="http://alpha.mixi.co.jp/blog/">http://alpha.mixi.co.jp/blog/</a></li></ul><br /><b><span><a href="http://twitter.com/tmaesaka">@tmaesaka</a></span></b><br /><br />Mixiの前坂氏。Drizzleやmemcachedなどのプロジェクトにおいて精力的に活動している。長きにわたりニュージーランドに在住しているため英語はペラペラである。最近はTokyo Cabinetにデータを格納するDrizzle用ストレージエンジンであるBlitzDBの開発に勤しんでいる。<br /><br /><b>関連リンク</b><br /><ul><li>オープンソースの活動「すごく、いい」 前坂徹さんのエンジニアライフ <a href="http://okyuu.com/ja/special/engineer08-tmaesaka">http://okyuu.com/ja/special/engineer08-tmaesaka</a></li><li>前坂氏のブログ（英語） <a href="http://torum.net/">http://torum.net/</a></li><li>バイリンガルの独り言 <a href="http://ja.torum.net/">http://ja.torum.net/</a></li><li>BlitzDB <a href="https://launchpad.net/blitzdb">https://launchpad.net/blitzdb</a></li><li>Drizzle <a href="https://launchpad.net/drizzle">https://launchpad.net/drizzle</a></li><li>memcached <a href="http://www.danga.com/memcached">http://www.danga.com/memcached</a></li></ul><br /><b><span><a href="http://twitter.com/stanaka">@stanaka</a></span></b><br /><br />とあるはてな社員こと田中氏。はてなを果てしなくスケーリング<span>（注：ダジャレではありません。）</span><br /><br /><b>関連リンク</b><br /><ul><li>とあるはてな社員の日記 <a href="http://d.hatena.ne.jp/stanaka/">http://d.hatena.ne.jp/stanaka/</a></li></ul><br /><b><span><a href="http://twitter.com/tokuhirom">@tokuhirom</a></span></b><br /><br />えとらぼ松野氏。だまってコードを書く人。<br /><br /><b>関連リンク</b><br /><ul><li>TokuLog 改めB日記 <a href="http://d.hatena.ne.jp/tokuhirom/">http://d.hatena.ne.jp/tokuhirom/</a></li><li>広がれエンジニアの輪 第2回 松野徳大 -- 「だまってコードを書けよ」&nbsp;<a href="http://jibun.atmarkit.co.jp/lcom01/rensai/comrade02/comrade01.html">http://jibun.atmarkit.co.jp/lcom01/rensai/comrade02/comrade01.html</a></li></ul><br /><b><span><a href="http://twitter.com/hirose31">@hirose31</a></span></b><br /><br />えとらぼのひろせまさあき氏。ブログのネタはいつも秀逸。<br /><br /><b>関連リンク</b><br /><ul><li>(ひ)メモ <a href="http://d.hatena.ne.jp/hirose31/">http://d.hatena.ne.jp/hirose31/</a></li><li>「ブラックボックスは不安でしょ」　ひろせまさあきさんのエンジニアライフ <a href="http://okyuu.com/ja/special/%E7%89%B9%E9%9B%86_No_okyuu_No_Life_%E7%AC%AC3%E5%9B%9E">http://okyuu.com/ja/special/特集_No_okyuu_No_Life_第3回</a></li></ul><br /><span><b><span><a href="http://twitter.com/ichii386">@ichii386</a></span></b></span><br /><span><br /></span><br /><span><span>GREEの一井氏。InnoDBラブなMySQLerが多い中で異色のMyISAMラヴ!!な逸材。一井氏曰く、分析計の処理にはMyISAMの取り回しの手軽さが便利とのこと。</span></span><br /><span><span><br /></span></span><br /><span><b><span>関連リンク</span></b></span><br /><ul><li>いちいの日記 <a href="http://d.hatena.ne.jp/ichii386/">http://d.hatena.ne.jp/ichii386/</a></li><li><span><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774131393/ref=nosim/nippondanji01-22">Ethna×PHP (LLフレームワークBOOKS)</a></span></li></ul><br /><br /><br />お次はMySQLの中の人。まずは日本人から。<br /><br /><b><span><a href="http://twitter.com/matsunobu">@matsunobu</a></span></b><br /><br />言わずと知れたMySQLのコンサルタント松信氏。数多くの書籍を執筆し、<strike><span>印税でウハウハしている</span></strike>MySQLの普及に大きく貢献している。最近受けたOkyuu.comのインタビュー記事では、「夢はエンジニアに強い影響を与える本を書くこと」と述べているのは感心する志である。この調子でこれからも頑張って頂きたい。<br /><br /><b>関連リンク</b><br /><ul><li>夢はエンジニアに強い影響を与える本を書くこと　松信嘉範さんのエンジニアライフ <a href="http://okyuu.com/ja/special/engineer09-matsunobu">http://okyuu.com/ja/special/engineer09-matsunobu</a></li><li>Open Database Life <a href="http://opendatabaselife.blogspot.com/">http://opendatabaselife.blogspot.com/</a></li></ul><b><br /></b><br /><b><span><a href="http://twitter.com/rkajiyama">@rkajiyama</a></span></b><br /><br />トレーナーから技術支援まで幅広くこなすタフガイ梶山氏。日本語の（Webを含む）セミナーやイベントではまず梶山氏が登場するので、ご存じの方も多いのではないだろうか。APAC地域担当であるため、かなりの期間を海外で過ごしている。<br /><br /><b><span><a href="http://twitter.com/meijik">@meijik</a></span></b><br /><br />同じMySQLサポートエンジニアにしてキムラデービー代表の木村氏。カレーが大好きで、ランチはカレー率が非常に高い。ブログにもカレーの記事が満載である。たまにDB Magazine等の雑誌に記事を投稿している。また、OSS RDBMSとしてはMySQLだけでなくFirebird関連の活動も活発に行っている。現在Firebird（徹底）入門書籍執筆中。<br /><br /><b>関連リンク</b><br /><ul><li>キムラデービーブログ <a href="http://blog.kimuradb.com/">http://blog.kimuradb.com</a></li><li>適材適所のデータベース選択が重要--Firebird日本ユーザー会 <a href="http://japan.zdnet.com/sp/interview/story/0,2000056426,20354736,00.htm">http://japan.zdnet.com/sp/interview/story/0,2000056426,20354736,00.htm</a></li></ul><br /><br /><b><span><a href="http://twitter.com/nippondanji">@nippondanji</a></span></b><br /><br />いわゆる<b><span>俺</span></b>。フォロー歓迎。<br /><br /><br />続いて英語圏の中の人たち。英語が堪能ならぜひフォローを。<br /><br /><b><span><a href="http://twitter.com/brianaker">@brianaker</a></span></b><br /><br />OSSの申し子Brian Aker氏。MySQLの各種ストレージエンジン（FEDERATED、ARCHIVE、Blackhole）、memcached、Drizzle、Gearmanなど、様々な実績を残している天才プログラマである。使用しているエディタはvim。MySQLに入社する条件として「絶対にノベルティのTシャツは着ない」というものを提示した頑固者。彼の語り口は非常にマイルドで、それでいて常に論理的である。Aker氏は尊子Richard Stallmanとディベートを行ったのだが、尊子よりも主張が論理的ですらあるように感じてしまうから驚きである。俺は二人とも大好きだ！<br /><br /><b>関連リンク</b><br /><ul><li>BRIAN AKER DEBATES WITH RICHARD STALLMAN <a href="http://www.bytebot.net/blog/archives/2009/10/25/brian-aker-debates-with-richard-stallman">http://www.bytebot.net/blog/archives/2009/10/25/brian-aker-debates-with-richard-stallman</a></li><li>Brian "Krow" Aker's Idle Thoughts <a href="http://krow.livejournal.com/">http://krow.livejournal.com/</a></li></ul><br /><b><span><a href="http://twitter.com/stewartsmith">@stewartsmith</a></span></b><br /><br />元MySQL Clusterの開発者にして、Drizzleの開発者Stewart Smith氏。写真ではオッサンっぽく見える場合もあるが実は結構若い。もちろん技術的にはエキスパートであり、彼のブログでは度々参考になる情報が掲載されているから見逃せない。<br /><br /><b>関連リンク</b><br /><ul><li>Ramblings <a href="http://www.flamingspork.com/blog/">http://www.flamingspork.com/blog/</a></li></ul><br /><b><span><a href="http://twitter.com/kajarno">@kajarno</a></span></b><br /><br />MySQLコミュニティ担当副社長のKaj Arno氏。MySQLのスポークスパーソン的存在。MySQL ABがコミュニティと良好な関係を保ってこられたのは彼の功績によるところが大きい。Bad Newsを魔法のようにGood Newsに変えるともっぱらの噂である。<br /><br /><b>関連リンク</b><br /><ul><li>ブログ <a href="http://blogs.mysql.com/kaj/">http://blogs.mysql.com/kaj/</a></li></ul><br /><b><span><a href="http://twitter.com/datacharmer">@datacharmer</a></span></b><br /><br />MySQLコミュニティ担当のGiuseppe Maxia氏。Datacharmerというのは彼のニックネーム。ジュゼッペ氏はMySQL::Sandboxの作者としても知られる。MySQL::Sandboxは相当便利なので使うべし！<br /><br /><b>関連リンク</b><br /><ul><li>ブログ <a href="http://datacharmer.blogspot.com/">http://datacharmer.blogspot.com/</a></li><li>MySQL::Sandbox <a href="http://mysqlsandbox.net/">http://mysqlsandbox.net/</a></li></ul><br /><b><span><a href="http://twitter.com/LenzGr">@LenzGr</a></span></b><br /><br />同じくMySQLコミュニティ担当のLenz Grimmer氏。Planet MySQLを管理しているのは彼である。<br /><br /><br />さらに中の人を紹介するが、以下はサポートチームの面々である。詳しい説明は省略する。<br /><br /><b><a href="http://twitter.com/maximuscub">@maximuscub</a></b><br /><br />俺の上司のLachlan。若くてマッチョなオーストラリア人。<br /><br /><b><a href="http://twitter.com/adamtdixon">@adamtdixon</a></b><br /><br />APAC地区でMySQL Clusterを担当しているAdam。<br /><br /><b><a href="http://twitter.com/geertjanvdk">@geertjanvdk</a></b><br /><br />EMEA地区でMySQL Clusterを担当しているGeert。<br /><br /><b><a href="http://twitter.com/lathiat">@lathiat</a></b><br /><br />見たまんまギークなTrent。かなりの早口なので、脳をオーバークロックしている疑いが持たれている。<br /><br /><b><a href="http://twitter.com/garypendergast">@garypendergast</a></b><br /><br />長期休暇取得中のGary。今はイタリアを放浪しているらしい。しかし仕事はチョッパ。<br /><br /><br />以下はその他の英語圏のMySQL関連アカウント。<br /><br /><b><span><a href="http://twitter.com/jzawodn">@jzawodn</a></span></b><br /><br />誉れ高き名著<b>「High Performance MySQL」</b>の著者、Jeremy Zawodny氏。元米Yahoo!のDBA。MySQLのレプリケーションで参照系の負荷を分散できる！ということを、実際のシステムで証明して見せたのは彼が最初ではないだろうか。<br /><br /><b>関連リンク</b><br /><ul><li>ブログ <a href="http://jeremy.zawodny.com/blog/">http://jeremy.zawodny.com/blog/</a></li></ul><br /><b><span><a href="http://twitter.com/martenmickos">@martenmickos</a></span></b><br /><br />元MySQL ABのCEO、Marten Mickos氏。MySQLは技術者集団だが、Mickos氏は経営のプロ。惜しい人物を放出したものである。<br /><br /><b><span><a href="http://twitter.com/launchpad_net">@launchpad_net</a></span></b><br /><br />MySQLの公開リポジトリをホスティングしているLaunchpadの公式アカウント。<br /><br /><b>関連リンク</b><br /><ul><li>Launchpad <a href="http://launchpad.net/">http://launchpad.net/</a></li></ul><br /><b><span><a href="http://twitter.com/Kickfire">@Kickfire</a></span></b><br /><br />MySQLを用いたDWHアプライアンスを販売している米Kickfire社の公式アカウント。KickfireはDWH用のストレージエンジンであるが、興味深いのは「SQLチップ」なるものを用いた専用のハードウェアで動作するるところ。汎用CPUでは達成できない性能を叩き出す。<br /><br /><b>関連リンク</b><br /><ul><li>Kickfire&nbsp;<a href="http://www.kickfire.com/">http://www.kickfire.com/</a></li></ul><br /><b><a href="http://twitter.com/webyog"><span>@webyog</span></a></b><br /><br />MySQLのGUIを販売するWebyog社のアカウント。<br /><br /><b>関連リンク</b><br /><ul><li>Webyog <a href="http://www.webyog.com/">http://www.webyog.com/</a></li></ul><br /><b><span><a href="http://twitter.com/Percona">@Percona</a></span></b><br /><br />MySQL Performance Blogでお馴染みのPercona社のアカウント。InnoDBの達人である木下氏が所属する会社でもある。（木下氏はPercona社にてXtraDBやXtraBackupの開発に勤しんでいる。オトコ的には木下氏にも呟いて貰いたいところである。）<br /><br /><b>関連リンク</b><br /><ul><li>Percona <a href="http://www.percona.com/">http://www.percona.com/</a></li><li>MySQL Performance Blog <a href="http://www.mysqlperformanceblog.com/">http://www.mysqlperformanceblog.com/</a></li><li>DB改造屋雑記 <a href="http://buildup-db.blogspot.com/">http://buildup-db.blogspot.com/</a></li></ul><br />というわけで、思いつくままにMySQLerなTwitterアカウントを並べてみたが、是非皆さんも彼らをフォローしてみて頂きたい。データベースを開発や運用でどう上手に使いこなすかということは、システム屋ないしはWeb系のエンジニアにとって非常に重要な課題である。Twitterを活用して情報を仕入れたりディスカッションに参加したりして、ぜひスキルアップに役立てて貰いたいものである。ここに挙げたアカウントはほんの一部であることを断っておく。実際にはまだまだこんなものではなくもっと大勢の優秀なMySQLerが存在する。もし、<b>「この人が抜けてるだろ！」</b>とか<b>「俺も載せろ！」</b>という方がいらっしゃったら、Twitterで<a href="http://twitter.com/nippondanji">@nippondanji</a>へこっそりとダイレクトメッセージを送って頂きたい。<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1906500952232920237-828746493839010520?l=nippondanji.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21972&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21972&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Wed, 28 Oct 2009 14:29:00 +0000</pubDate>
    <dc:creator>Mikiya Okuno</dc:creator>
    <category>mysql</category>
    <category>twitter</category>
  </item>

  <item>
    <title>一家に一冊。あのオプションなんだっけ？と思った時のために備えて。- #書評_ - MySQL全機能バイブル</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-1906500952232920237.post-7575233764412740027</guid>
    <link>http://nippondanji.blogspot.com/2009/10/mysql.html</link>
    <description>著者鈴木啓修様より献本御礼。（←一度言ってみたかったｗ）本書は鈴木氏の前著である「MySQL全機能リファレンス」からのアップデートであるが、この度は最新バージョンであるMySQL 5.1対応になっての登場である。今の時代、一家に一台テレビがあるように、はたまたパソコンがあるように、いやいや冷蔵庫があるように、一家に一冊本書があってもいいのではなかろうか。MySQLがオフィシャルに提供しているリファレンスマニュアルを除いて、MySQLをここまで網羅的に解説している書籍を私は知らない。その網羅性は目次だけで13ページも費やしていることからも、容易に想像出来ることだろう。もくじを見ただけでもその網羅性がよく分かるだろう。このもくじを書いただけで既に腕がつりそうである。Chapter 01 イントロダクション■■　概要1-01 MySQL™とは1-02 MySQLの概要1-03 データベースシステムの構造1-04 ストレージエンジンChapter 02 MySQLの内部構造■■　プロセスとメモリ構造2-01 プロセス構造2-02 メモリ構造■■　問い合わせ処理2-03 問い合わせ処理2-04 プランナ2-05 MyISAMのエクゼキュータ処理■■　データベースディレクトリの構造2-06 データベースディレクトリの構造■■　テーブルの構造2-07 MyISAM型2-08 InnoDB型■■　トランザクションの隔離レベル2-09 トランザクションの隔離レベル■■　INSERT DELAYED文2-10 INSERT DELAYED文■■　クエリキャッシュ（Query Cache）2-11 クエリキャッシュ（Query Cache）Chapter 03 MySQLのインストール3-01 インストール準備3-02 インストールChapter 04 MySQLサーバ管理■■　イントロダクション4-01 MySQLサーバ管理■■　初期設定4-02 初期設定■■　サーバの起動/停止4-03 MySQLサーバの起動と停止4-04 MySQLサーバの起動4-05 MySQLサーバの停止4-06 MySQLサーバをデーモンとして起動する■■　データベースユーザ管理4-07 MySQLにおけるデータベースユーザの概念4-08 データベースユーザの管理■■　システム変数の設定4-09 システム変数の設定4-10 サーバの動作に関するシステム変数4-11 通信関連のシステム変数4-12 問い合わせ処理に関するシステム変数4-13 ストレージエンジン関連のシステム変数4-14 ログ関連のシステム変数4-15 表示や文字コードに関連するシステム変数4-16 SQL_MODE4-17 レプリケーション関連のシステム変数4-18 その他のシステム変数■■　ストレージエンジン4-19 MyISAM型4-20 InnoDB型4-21 MEMORY型（旧 HEAP型）4-22 パーティション■■　ログ4-23 ログファイル4-24 バイナリログ（binary log）4-25 スロークエリのログ（slow query log）4-26 一般クエリログ（general query log）■■　データベースのダンプ/リストア4-27 データベースのダンプ/リストア（再構築）4-28 ファイル群のコピーによるダンプ/リストア4-29 mysqldumpによるダンプ/リストア■■　管理ツール4-30 mysqladminとは4-31 データベースの作成/削除4-32 サーバの情報表示4-33 FLOSH/RELOAD4-34 パスワードの変更4-35 スレーブ機能の開始/停止4-36 mysqlcheck■■　文字コード4-37 MySQLのサポートする文字コード4-38 文字コードの設定と確認■■　レプリケーション4-39 レプリケーションとは4-40 MySQLにおけるレプリケーションの仕組み4-41 レプリケーションの設定4-42 運用/管理■■　クエリキャッシュ4-43 クエリキャッシュ（Query Cache）Chapter 05 mysqlの使い方■■　mysqlの使い方5-01 mysqlの使い方■■　mysqlの起動オプション5-02 MySQLサーバとの接続と切断5-03 表示と結果出力5-04 バッチ処理とSQL文の実行5-05 実行制御■■　mysqlのメタコマンド5-06 再接続と切断5-07 表示の制御5-08 バッチファイルの処理,および結果のファイル出力5-09 SQL文の編集と表示5-10 プロンプト5-11 接続中のセッション情報を表示Chapter 06 SQL■■　SQL6-01 SQL文一覧6-02 語彙■■　データベースの作成/削除/接続6-03 データベースの作成 CREATE DATABASE6-04 データベースの削除 DROP DATABASE6-05 データベースの属性変更 ALTER DATABASE6-06 データベースの一覧表示 SHOW DATABASES6-07 データベースへの接続 USE■■　テーブルの作成/削除6-08 テーブルの作成 CREATE TABLE6-09 テーブルの削除 DROP TABLE■■　テーブルの情報表示6-10 テーブル定義（テーブルスキーマ）の表示 SHOW CREATE TABLE6-11 列の属性を表示 SHOW COLUMNS FROM/SHOW FIELDS FROM/DESCRIBE/DESC6-12 テーブルの一覧表示 SHOW TABLES6-13 テーブルの情報表示 SHOW TALBE STATUS■■　テーブルの属性変更6-14 テーブル属性の変更 ALTER TABLE6-15 列の追加と削除 ALTER TABLE ADD COLUMN/ALTER TABLE DROP COLUMN6-16 インデックスの追加と削除 ALTER TABLE ADD INDEX|CREATE INDEX/ALTER TABLE DROP INDEX|DROP INDEX6-17 主キーの追加と削除 ALTER TABLE ADD PRIMARY KEY/ALTER TABLE DROP PRIMARY KEY6-18 一意性制約の追加 ALTER TABLE ADD UNIQUE6-19 外部キー制約の追加と削除 ALTER TABLE ADD FOREIGN KEY/ALTER TABLE DROP FOREIGN KEY6-20 デフォルト値の設定と削除 ALTER TABLE ALTER SET DEFAULT/ALTER TABLE ALTER DROP DEFAULT6-21 列定義、列名の変更 ALTER TABLE MODIFY COLUMN/ALTER TABLE CHANGE COLUMN6-22 テーブル名の変更 ALTER TABLE RENAME6-23 テーブル名の変更 RENAME TABLE■■　データベースユーザの作成と削除6-24 データベースユーザの作成と削除 CREATE USER/DROP USER■■　データベースユーザの管理6-25 データベースユーザの権限設定と削除 GRANT/REVOKE6-26 データベースユーザの権限表示 SHOW GRANTS■■　データの挿入6-27 データの挿入 INSERT6-28 データの挿入 REPLACE■■　SELECT6-29 データの検索 SELECT6-30 重複する行を削除 DISTINCT6-31 FROM句6-32 テーブル結合 CROSS JOIN/INNER JOIN/OUTER JOIN6-33 WHERE句6-34 グループ化 GROUP BY, HAVING6-35 検索結果の並び替え ORDER BY6-36 検索結果の出力範囲を指定 LIMIT, OFFSET6-37 排他的六句と共有ロック FOR UPDATE/LOCK IN SHARE MODE6-38 問い合わせの結合 UNION6-39 副問い合わせ■■　データの更新6-40 データの更新 UPDATE■■　データの削除6-41 データの削除 DELETE6-42 全データの削除 TRUNCATE■■　式や関数の実行6-43 式や関数の実行 DO■■　プリペアードステートメント6-44 プリペアードステートメントの準備、実行、削除 PREPARE/EXECUTE/DEALLOCATE PREPARE■■　問い合わせ計画の表示6-45 問い合わせ計画の表示 EXPLAIN■■　ストアドプロシージャ・ストアドファンクション6-46 ストアドプロシージャ・ストアドファンクションの定義表示 SHOW CREATE PROCEDURE/SHOW CREATE FUNCTION6-47 ストアドプロシージャ・ストアドファンクションの状態表示 SHOW PROCEDURE STATUS/SHOW FUNCTION STATUS■■　インデックスの表示6-48 インデックスの表示 SHOW INDEX/SHOW KEYS■■　インデックス情報の更新6-49 インデックス情報の更新 ANALYZE TABLE■■　ビュー6-50 ビューの作成、変更、削除 CREATE VIEW/ALTER VIEW/DROP VIEW6-51 ビューの定義表示 SHOW CREATE VIEW■■　トリガ6-52 トリガの定義、変更、削除 CREATE TRIGGER/ALTER TRIGGER/DROP TRIGGER6-53 トリガの定義表示 SHOW TRIGGERS■■　テーブルの最適化6-54 テーブルの最適化 OPTIMIZE TABLE■■　テーブルの検査と修復6-55 テーブルの検査 CHECK TABLE6-56 テーブルの修復 REPAIR TABLE■■　トランザクション6-57 トランザクション BEGIN|START TRANSACTION/COMMIT/ROLLBACK6-58 セーブポイントの設定とロールバック SAVEPOINT/ROLLBACK TO SAVEPOINT6-59 トランザクションの分離レベル設定 SET TRANSACTION ISOLATION LEVEL■■　ロック6-60 テーブルのロックと解除 LOCK TABLES/UNLOCK TABLES■■　テーブルデータのインポートとエクスポート6-61 テーブルデータのインポート LOAD DATA INFILE6-62 テーブルデータのエクスポート SELECT INTO OUTFILE/SELECT INTO DUMPFILE■■　テーブルのバックアップとリストア6-63 テーブルのバックアップ BACKUP TABLE6-64 テーブルのリストア RESTORE TABLE■■　ログの管理6-65 ログの切り換え FLUSH LOGS6-66 バイナリログ一覧表示 SHOW BINARY LOGS/SHOW MASTER LOGS6-67 バイナリログの内容表示 SHOW BINLOG EVENTS6-68 バイナリログの全削除 RESET MASTER6-69 バイナリログの削除 PURGE MASTER LOGS■■　サーバの制御と状態表示6-70 スレッドの情報表示とKILL SHOW PROCESSLIST/KILL6-71 システム変数の変更 SET|SET OPTION6-72 システム変数の表示 SHOW VARIABLES6-73 データベースサーバの状態表示 SHOW STATUS6-74 各種情報やログのリセット FLUSH6-75 権限テーブルの再読込み FLUSH PRIVILEGES6-76 クエリキャッシュの出フラグメント FLUSH QUERY CACHE6-77 テーブルのクローズ FLUSH TABLES|FLUSH TABLE/FLUSH TABLES WITH READ LOCK6-78 ステータス情報のリセット FLUSH STATUS6-79 問い合わせ実行回数のリセット FLUSH USER_RESOURCES■■　レプリケーション6-80 レプリケーションに関するスレッドの状態表示 SHOW PROCESSLIST6-81 マスターサーバの状態表示 SHOW MASTER STATUS6-82 接続しているスレーブの一覧表示 SHOW SLAVE HOSTS6-83 スレーブ機能の起動と停止 START SLAVE (SLAVE START) / STOP SLAVE (SLAVE STOP)6-84 スレーブの状態表示 SHOW SLAVE STATUS6-85 スレーブ機能のリセット RESET SLAVE6-86 マスターサーバの変更 CHANGE MASTERChapter 07 データ型、演算子と関数■■　データ型7-01 MySQLがサポートするデータ型7-02 数値データ型7-03 文字データ型7-04 ENUM型、SET型7-05 BLOB（BINARY LARGE OBJECT）型7-06 日付/時刻データ型7-07 ビット型■■　演算子7-08 MySQLのサポートする演算子7-09 論理演算子7-10 比較演算子7-11 算術演算子7-12 日付/時刻演算子7-13 COLUMNパターンマッチング■■　関数7-14 MySQLがサポートする関数7-15 算術関数7-16 集約関数7-17 文字列関数7-18 日付/時刻関数7-19 型変換関数7-20 その他の関数Chapter 08 ストアドプロシージャ・ストアドファンクション■■　概要8-01 ストアドプロシージャ・ストアドファンクションとは8-02 ストアドプロシージャ・ストアドファンクションの定義と実行、削除■■　プログラミングの基本8-03 ローカル変数宣言と値の代入8-04 SELECT INTO文■■　制御構造8-05 条件分岐と場合分け8-06 ループ処理8-07 ハンドラー■■　カーソル8-08 カーソル8-09 カーソル変数の宣言とオープン、クローズ DECLARE CURSOR FOR/OPEN/CLOSE8-10 FETCH文によるカーソル行の取得 FETCH8-11 カーソルを使った例この本は、とても簡潔な（悪い言い方をすると淡々とした）文体で書き進められている。リファレンスなので淡々としているのは当然と言えば当然なのであるが、それでいて説明が明快なのは感心するところである。しかし本書の真の価値は文章ではないと断言する！本書を手にとって少しめくればすぐに気付くであろう。その図表の多さに。そう、この本の真の価値は図表にある。文章による説明は必要最低限であるのだが、その代わり豊富な図表が補って余りあるぐらい雄弁にMySQLの各種機能を説明してくれるのである。文章をいちいち読むのではなく、図表で素早く内容を理解できるというのは、リファレンス本にとって至上命題の一つであろう。また、図表以外に目をひくのがコマンドやSQL文の実行例の多さである。各種機能の説明には必ずと言って良いほどSQLやコマンドの実行結果が掲載されている。説明を読んだだけではちょっとピンと来ないな・・・と思うような機能であっても、実行例を見れば一目瞭然という寸法である。本書の内容を改めて見てみると、MySQLには膨大な機能があるんだなということに気付く。もちろん本書ではカバーされていない機能もあるが、それにしても膨大な機能である。（MySQLは高速だが機能が少ないと言う定説を疑いたくなるぐらいである。）その膨大な機能の説明を成し遂げた鈴木氏の努力は、並大抵のものではないと言えよう。ちなみに、本書の最後には「参考書籍」が紹介されているのだが、その中には私（つまりこのブログの筆者）が執筆した出版予定の書籍（仮題：MySQLエキスパートトラブルシューティングガイド）が紹介されている。まだ出版されていない（鈴木氏に原稿を見せたということもない）書籍を「参考書籍」として紹介するというのは前代未聞の所業ではないだろうかと思うのだが、鈴木氏曰く「参考にした書籍ではなく、参考になる書籍という意味で掲載するからOK!」ということらしい。※この点については鈴木氏本人より「誤解を招く表現」との指摘があったので修正させて頂く。この文面からすると鈴木氏は架空の内容を参考にしたように読み取れるがそうではない。鈴木氏は次の2点を見て「この書籍なら参考にするに値する」と判断して下さったそう。ブログに掲載した原稿のプチ抜粋個人的に見せた書籍の「もくじ」（内容は送っていない）オモシロおかしく書いたつもりが、思わぬ茶々になってしまって面目ないです＞鈴木氏MySQLエキスパートトラブルシューティングガイド（仮題）では、本書で取り上げられていない機能、例えばSHOW INNODB STATUSの見方やINFORMATION_SCHEMA、プロファイリング、トレースファイル、DTraceプローブなども解説するので乞うご期待。そんなわけで、本書は網羅的で図表や実行例を駆使してとても分かり易いMySQLのリファレンスであり、初心者から上級者まで幅広い方々におすすめである。</description>
    <content:encoded><![CDATA[<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774139750/ref=nosim/nippondanji01-22"><img alt="MySQL全機能バイブル ~現場で役立つAtoZ~" src="http://ecx.images-amazon.com/images/I/51oarbWYKbL._SL160_.jpg" style="border: 0px; float: right;" title="MySQL全機能バイブル ~現場で役立つAtoZ~" /></a>著者鈴木啓修様より献本御礼。<span><span>（←一度言ってみたかったｗ）</span></span><br /><br />本書は鈴木氏の前著である「MySQL全機能リファレンス」からのアップデートであるが、この度は最新バージョンであるMySQL 5.1対応になっての登場である。<br /><br />今の時代、一家に一台テレビがあるように、はたまたパソコンがあるように、いやいや冷蔵庫があるように、一家に一冊本書があってもいいのではなかろうか。MySQLがオフィシャルに提供しているリファレンスマニュアルを除いて、MySQLをここまで網羅的に解説している書籍を私は知らない。その網羅性は目次だけで13ページも費やしていることからも、容易に想像出来ることだろう。<br /><br />もくじを見ただけでもその網羅性がよく分かるだろう。このもくじを書いただけで既に腕がつりそうである。<br /><br /><div><b>Chapter 01 イントロダクション</b><br /><span>■■　概要</span><br /><span>1-01 MySQL™とは</span><br /><span>1-02 MySQLの概要</span><br /><span>1-03 データベースシステムの構造</span><br /><span>1-04 ストレージエンジン</span><br /><b>Chapter 02 MySQLの内部構造</b><br /><span>■■　プロセスとメモリ構造</span><br /><span>2-01 プロセス構造</span><br /><span>2-02 メモリ構造</span><br /><span>■■　問い合わせ処理</span><br /><span>2-03 問い合わせ処理</span><br /><span>2-04 プランナ</span><br /><span>2-05 MyISAMのエクゼキュータ処理</span><br /><span>■■　データベースディレクトリの構造</span><br /><span>2-06 データベースディレクトリの構造</span><br /><span>■■　テーブルの構造</span><br /><span>2-07 MyISAM型</span><br /><span>2-08 InnoDB型</span><br /><span>■■　トランザクションの隔離レベル</span><br /><span>2-09 トランザクションの隔離レベル</span><br /><span>■■　INSERT DELAYED文</span><br /><span>2-10 INSERT DELAYED文</span><br /><span>■■　クエリキャッシュ（Query Cache）</span><br /><span>2-11 クエリキャッシュ（Query Cache）</span><br /><b>Chapter 03 MySQLのインストール</b><br /><span>3-01 インストール準備</span><br /><span>3-02 インストール</span><br /><b>Chapter 04 MySQLサーバ管理</b><br /><span>■■　イントロダクション</span><br /><span>4-01 MySQLサーバ管理</span><br /><span>■■　初期設定</span><br /><span>4-02 初期設定</span><br /><span>■■　サーバの起動/停止</span><br /><span>4-03 MySQLサーバの起動と停止</span><br /><span>4-04 MySQLサーバの起動</span><br /><span>4-05 MySQLサーバの停止</span><br /><span>4-06 MySQLサーバをデーモンとして起動する</span><br /><span>■■　データベースユーザ管理</span><br /><span>4-07 MySQLにおけるデータベースユーザの概念</span><br /><span>4-08 データベースユーザの管理</span><br /><span>■■　システム変数の設定</span><br /><span>4-09 システム変数の設定</span><br /><span>4-10 サーバの動作に関するシステム変数</span><br /><span>4-11 通信関連のシステム変数</span><br /><span>4-12 問い合わせ処理に関するシステム変数</span><br /><span>4-13 ストレージエンジン関連のシステム変数</span><br /><span>4-14 ログ関連のシステム変数</span><br /><span>4-15 表示や文字コードに関連するシステム変数</span><br /><span>4-16 SQL_MODE</span><br /><span>4-17 レプリケーション関連のシステム変数</span><br /><span>4-18 その他のシステム変数</span><br /><span>■■　ストレージエンジン</span><br /><span>4-19 MyISAM型</span><br /><span>4-20 InnoDB型</span><br /><span>4-21 MEMORY型（旧 HEAP型）</span><br /><span>4-22 パーティション</span><br /><span>■■　ログ</span><br /><span>4-23 ログファイル</span><br /><span>4-24 バイナリログ（binary log）</span><br /><span>4-25 スロークエリのログ（slow query log）</span><br /><span>4-26 一般クエリログ（general query log）</span><br /><span>■■　データベースのダンプ/リストア</span><br /><span>4-27 データベースのダンプ/リストア（再構築）</span><br /><span>4-28 ファイル群のコピーによるダンプ/リストア</span><br /><span>4-29 mysqldumpによるダンプ/リストア</span><br /><span>■■　管理ツール</span><br /><span>4-30 mysqladminとは</span><br /><span>4-31 データベースの作成/削除</span><br /><span>4-32 サーバの情報表示</span><br /><span>4-33 FLOSH/RELOAD</span><br /><span>4-34 パスワードの変更</span><br /><span>4-35 スレーブ機能の開始/停止</span><br /><span>4-36 mysqlcheck</span><br /><span>■■　文字コード</span><br /><span>4-37 MySQLのサポートする文字コード</span><br /><span>4-38 文字コードの設定と確認</span><br /><span>■■　レプリケーション</span><br /><span>4-39 レプリケーションとは</span><br /><span>4-40 MySQLにおけるレプリケーションの仕組み</span><br /><span>4-41 レプリケーションの設定</span><br /><span>4-42 運用/管理</span><br /><span>■■　クエリキャッシュ</span><br /><span>4-43 クエリキャッシュ（Query Cache）</span><br /><b>Chapter 05 mysqlの使い方</b><br /><span>■■　mysqlの使い方</span><br /><span>5-01 mysqlの使い方</span><br /><span>■■　mysqlの起動オプション</span><br /><span>5-02 MySQLサーバとの接続と切断</span><br /><span>5-03 表示と結果出力</span><br /><span>5-04 バッチ処理とSQL文の実行</span><br /><span>5-05 実行制御</span><br /><span>■■　mysqlのメタコマンド</span><br /><span>5-06 再接続と切断</span><br /><span>5-07 表示の制御</span><br /><span>5-08 バッチファイルの処理,および結果のファイル出力</span><br /><span>5-09 SQL文の編集と表示</span><br /><span>5-10 プロンプト</span><br /><span>5-11 接続中のセッション情報を表示</span><br /><b>Chapter 06 SQL</b><br /><span>■■　SQL</span><br /><span>6-01 SQL文一覧</span><br /><span>6-02 語彙</span><br /><span>■■　データベースの作成/削除/接続</span><br /><span>6-03 データベースの作成 CREATE DATABASE</span><br /><span>6-04 データベースの削除 DROP DATABASE</span><br /><span>6-05 データベースの属性変更 ALTER DATABASE</span><br /><span>6-06 データベースの一覧表示 SHOW DATABASES</span><br /><span>6-07 データベースへの接続 USE</span><br /><span>■■　テーブルの作成/削除</span><br /><span>6-08 テーブルの作成 CREATE TABLE</span><br /><span>6-09 テーブルの削除 DROP TABLE</span><br /><span>■■　テーブルの情報表示</span><br /><span>6-10 テーブル定義（テーブルスキーマ）の表示 SHOW CREATE TABLE</span><br /><span>6-11 列の属性を表示 SHOW COLUMNS FROM/SHOW FIELDS FROM/DESCRIBE/DESC</span><br /><span>6-12 テーブルの一覧表示 SHOW TABLES</span><br /><span>6-13 テーブルの情報表示 SHOW TALBE STATUS</span><br /><span>■■　テーブルの属性変更</span><br /><span>6-14 テーブル属性の変更 ALTER TABLE</span><br /><span>6-15 列の追加と削除 ALTER TABLE ADD COLUMN/ALTER TABLE DROP COLUMN</span><br /><span>6-16 インデックスの追加と削除 ALTER TABLE ADD INDEX|CREATE INDEX/ALTER TABLE DROP INDEX|DROP INDEX</span><br /><span>6-17 主キーの追加と削除 ALTER TABLE ADD PRIMARY KEY/ALTER TABLE DROP PRIMARY KEY</span><br /><span>6-18 一意性制約の追加 ALTER TABLE ADD UNIQUE</span><br /><span>6-19 外部キー制約の追加と削除 ALTER TABLE ADD FOREIGN KEY/ALTER TABLE DROP FOREIGN KEY</span><br /><span>6-20 デフォルト値の設定と削除 ALTER TABLE ALTER SET DEFAULT/ALTER TABLE ALTER DROP DEFAULT</span><br /><span>6-21 列定義、列名の変更 ALTER TABLE MODIFY COLUMN/ALTER TABLE CHANGE COLUMN</span><br /><span>6-22 テーブル名の変更 ALTER TABLE RENAME</span><br /><span>6-23 テーブル名の変更 RENAME TABLE</span><br /><span>■■　データベースユーザの作成と削除</span><br /><span>6-24 データベースユーザの作成と削除 CREATE USER/DROP USER</span><br /><span>■■　データベースユーザの管理</span><br /><span>6-25 データベースユーザの権限設定と削除 GRANT/REVOKE</span><br /><span>6-26 データベースユーザの権限表示 SHOW GRANTS</span><br /><span>■■　データの挿入</span><br /><span>6-27 データの挿入 INSERT</span><br /><span>6-28 データの挿入 REPLACE</span><br /><span>■■　SELECT</span><br /><span>6-29 データの検索 SELECT</span><br /><span>6-30 重複する行を削除 DISTINCT</span><br /><span>6-31 FROM句</span><br /><span>6-32 テーブル結合 CROSS JOIN/INNER JOIN/OUTER JOIN</span><br /><span>6-33 WHERE句</span><br /><span>6-34 グループ化 GROUP BY, HAVING</span><br /><span>6-35 検索結果の並び替え ORDER BY</span><br /><span>6-36 検索結果の出力範囲を指定 LIMIT, OFFSET</span><br /><span>6-37 排他的六句と共有ロック FOR UPDATE/LOCK IN SHARE MODE</span><br /><span>6-38 問い合わせの結合 UNION</span><br /><span>6-39 副問い合わせ</span><br /><span>■■　データの更新</span><br /><span>6-40 データの更新 UPDATE</span><br /><span>■■　データの削除</span><br /><span>6-41 データの削除 DELETE</span><br /><span>6-42 全データの削除 TRUNCATE</span><br /><span>■■　式や関数の実行</span><br /><span>6-43 式や関数の実行 DO</span><br /><span>■■　プリペアードステートメント</span><br /><span>6-44 プリペアードステートメントの準備、実行、削除 PREPARE/EXECUTE/DEALLOCATE PREPARE</span><br /><span>■■　問い合わせ計画の表示</span><br /><span>6-45 問い合わせ計画の表示 EXPLAIN</span><br /><span>■■　ストアドプロシージャ・ストアドファンクション</span><br /><span>6-46 ストアドプロシージャ・ストアドファンクションの定義表示 SHOW CREATE PROCEDURE/SHOW CREATE FUNCTION</span><br /><span>6-47 ストアドプロシージャ・ストアドファンクションの状態表示 SHOW PROCEDURE STATUS/SHOW FUNCTION STATUS</span><br /><span>■■　インデックスの表示</span><br /><span>6-48 インデックスの表示 SHOW INDEX/SHOW KEYS</span><br /><span>■■　インデックス情報の更新</span><br /><span>6-49 インデックス情報の更新 ANALYZE TABLE</span><br /><span>■■　ビュー</span><br /><span>6-50 ビューの作成、変更、削除 CREATE VIEW/ALTER VIEW/DROP VIEW</span><br /><span>6-51 ビューの定義表示 SHOW CREATE VIEW</span><br /><span>■■　トリガ</span><br /><span>6-52 トリガの定義、変更、削除 CREATE TRIGGER/ALTER TRIGGER/DROP TRIGGER</span><br /><span>6-53 トリガの定義表示 SHOW TRIGGERS</span><br /><span>■■　テーブルの最適化</span><br /><span>6-54 テーブルの最適化 OPTIMIZE TABLE</span><br /><span>■■　テーブルの検査と修復</span><br /><span>6-55 テーブルの検査 CHECK TABLE</span><br /><span>6-56 テーブルの修復 REPAIR TABLE</span><br /><span>■■　トランザクション</span><br /><span>6-57 トランザクション BEGIN|START TRANSACTION/COMMIT/ROLLBACK</span><br /><span>6-58 セーブポイントの設定とロールバック SAVEPOINT/ROLLBACK TO SAVEPOINT</span><br /><span>6-59 トランザクションの分離レベル設定 SET TRANSACTION ISOLATION LEVEL</span><br /><span>■■　ロック</span><br /><span>6-60 テーブルのロックと解除 LOCK TABLES/UNLOCK TABLES</span><br /><span>■■　テーブルデータのインポートとエクスポート</span><br /><span>6-61 テーブルデータのインポート LOAD DATA INFILE</span><br /><span>6-62 テーブルデータのエクスポート SELECT INTO OUTFILE/SELECT INTO DUMPFILE</span><br /><span>■■　テーブルのバックアップとリストア</span><br /><span>6-63 テーブルのバックアップ BACKUP TABLE</span><br /><span>6-64 テーブルのリストア RESTORE TABLE</span><br /><span>■■　ログの管理</span><br /><span>6-65 ログの切り換え FLUSH LOGS</span><br /><span>6-66 バイナリログ一覧表示 SHOW BINARY LOGS/SHOW MASTER LOGS</span><br /><span>6-67 バイナリログの内容表示 SHOW BINLOG EVENTS</span><br /><span>6-68 バイナリログの全削除 RESET MASTER</span><br /><span>6-69 バイナリログの削除 PURGE MASTER LOGS</span><br /><span>■■　サーバの制御と状態表示</span><br /><span>6-70 スレッドの情報表示とKILL SHOW PROCESSLIST/KILL</span><br /><span>6-71 システム変数の変更 SET|SET OPTION</span><br /><span>6-72 システム変数の表示 SHOW VARIABLES</span><br /><span>6-73 データベースサーバの状態表示 SHOW STATUS</span><br /><span>6-74 各種情報やログのリセット FLUSH</span><br /><span>6-75 権限テーブルの再読込み FLUSH PRIVILEGES</span><br /><span>6-76 クエリキャッシュの出フラグメント FLUSH QUERY CACHE</span><br /><span>6-77 テーブルのクローズ FLUSH TABLES|FLUSH TABLE/FLUSH TABLES WITH READ LOCK</span><br /><span>6-78 ステータス情報のリセット FLUSH STATUS</span><br /><span>6-79 問い合わせ実行回数のリセット FLUSH USER_RESOURCES</span><br /><span>■■　レプリケーション</span><br /><span>6-80 レプリケーションに関するスレッドの状態表示 SHOW PROCESSLIST</span><br /><span>6-81 マスターサーバの状態表示 SHOW MASTER STATUS</span><br /><span>6-82 接続しているスレーブの一覧表示 SHOW SLAVE HOSTS</span><br /><span>6-83 スレーブ機能の起動と停止 START SLAVE (SLAVE START) / STOP SLAVE (SLAVE STOP)</span><br /><span>6-84 スレーブの状態表示 SHOW SLAVE STATUS</span><br /><span>6-85 スレーブ機能のリセット RESET SLAVE</span><br /><span>6-86 マスターサーバの変更 CHANGE MASTER</span><br /><b>Chapter 07 データ型、演算子と関数</b><br /><span>■■　データ型</span><br /><span>7-01 MySQLがサポートするデータ型</span><br /><span>7-02 数値データ型</span><br /><span>7-03 文字データ型</span><br /><span>7-04 ENUM型、SET型</span><br /><span>7-05 BLOB（BINARY LARGE OBJECT）型</span><br /><span>7-06 日付/時刻データ型</span><br /><span>7-07 ビット型</span><br /><span>■■　演算子</span><br /><span>7-08 MySQLのサポートする演算子</span><br /><span>7-09 論理演算子</span><br /><span>7-10 比較演算子</span><br /><span>7-11 算術演算子</span><br /><span>7-12 日付/時刻演算子</span><br /><span>7-13 COLUMNパターンマッチング</span><br /><span>■■　関数</span><br /><span>7-14 MySQLがサポートする関数</span><br /><span>7-15 算術関数</span><br /><span>7-16 集約関数</span><br /><span>7-17 文字列関数</span><br /><span>7-18 日付/時刻関数</span><br /><span>7-19 型変換関数</span><br /><span>7-20 その他の関数</span><br /><b>Chapter 08 ストアドプロシージャ・ストアドファンクション</b><br /><span>■■　概要</span><br /><span>8-01 ストアドプロシージャ・ストアドファンクションとは</span><br /><span>8-02 ストアドプロシージャ・ストアドファンクションの定義と実行、削除</span><br /><span>■■　プログラミングの基本</span><br /><span>8-03 ローカル変数宣言と値の代入</span><br /><span>8-04 SELECT INTO文</span><br /><span>■■　制御構造</span><br /><span>8-05 条件分岐と場合分け</span><br /><span>8-06 ループ処理</span><br /><span>8-07 ハンドラー</span><br /><span>■■　カーソル</span><br /><span>8-08 カーソル</span><br /><span>8-09 カーソル変数の宣言とオープン、クローズ DECLARE CURSOR FOR/OPEN/CLOSE</span><br /><span>8-10 FETCH文によるカーソル行の取得 FETCH</span><br /><span>8-11 カーソルを使った例</span><br /></div><br />この本は、とても簡潔な（悪い言い方をすると淡々とした）文体で書き進められている。リファレンスなので淡々としているのは当然と言えば当然なのであるが、それでいて説明が明快なのは感心するところである。しかし本書の真の価値は文章ではないと断言する！本書を手にとって少しめくればすぐに気付くであろう。その図表の多さに。<br /><br />そう、この本の真の価値は図表にある。文章による説明は必要最低限であるのだが、その代わり豊富な図表が補って余りあるぐらい雄弁にMySQLの各種機能を説明してくれるのである。文章をいちいち読むのではなく、図表で素早く内容を理解できるというのは、リファレンス本にとって至上命題の一つであろう。また、図表以外に目をひくのがコマンドやSQL文の実行例の多さである。各種機能の説明には必ずと言って良いほどSQLやコマンドの実行結果が掲載されている。説明を読んだだけではちょっとピンと来ないな・・・と思うような機能であっても、実行例を見れば一目瞭然という寸法である。<br /><br />本書の内容を改めて見てみると、MySQLには膨大な機能があるんだなということに気付く。もちろん本書ではカバーされていない機能もあるが、それにしても膨大な機能である。（MySQLは高速だが機能が少ないと言う定説を疑いたくなるぐらいである。）その膨大な機能の説明を成し遂げた鈴木氏の努力は、並大抵のものではないと言えよう。<br /><br /><strike>ちなみに、本書の最後には「参考書籍」が紹介されているのだが、その中には私（つまりこのブログの筆者）が執筆した出版予定の書籍（仮題：MySQLエキスパートトラブルシューティングガイド）が紹介されている。まだ出版されていない（鈴木氏に原稿を見せたということもない）書籍を「参考書籍」として紹介するというのは前代未聞の所業ではないだろうかと思うのだが、鈴木氏曰く「参考にした書籍ではなく、参考になる書籍という意味で掲載するからOK!」ということらしい。</strike><br /><blockquote>※この点については鈴木氏本人より「誤解を招く表現」との指摘があったので修正させて頂く。この文面からすると鈴木氏は架空の内容を参考にしたように読み取れるがそうではない。鈴木氏は次の2点を見て「この書籍なら参考にするに値する」と判断して下さったそう。<br /><ul><li><a href="http://nippondanji.blogspot.com/2009/06/blog-post_28.html">ブログに掲載した原稿のプチ抜粋</a></li><li>個人的に見せた書籍の「もくじ」（内容は送っていない）</li></ul>オモシロおかしく書いたつもりが、思わぬ茶々になってしまって面目ないです＞鈴木氏<br /></blockquote>MySQLエキスパートトラブルシューティングガイド（仮題）では、本書で取り上げられていない機能、例えばSHOW INNODB STATUSの見方やINFORMATION_SCHEMA、プロファイリング、トレースファイル、DTraceプローブなども解説するので乞うご期待。<br /><br />そんなわけで、本書は網羅的で図表や実行例を駆使してとても分かり易いMySQLのリファレンスであり、初心者から上級者まで幅広い方々におすすめである。<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1906500952232920237-7575233764412740027?l=nippondanji.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21941&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21941&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Tue, 27 Oct 2009 18:18:00 +0000</pubDate>
    <dc:creator>Mikiya Okuno</dc:creator>
    <category>mysql</category>
  </item>

  <item>
    <title>MyISAMとInnoDBのどちらを使うべきか</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-8317896764605662628.post-2291370513315457937</guid>
    <link>http://opendatabaselife.blogspot.com/2009/10/myisaminnodb.html</link>
    <description>Twitterで話題になってたので簡単にまとめました。●MyISAMにしか無い機能を使いたい場合はMyISAMを使うしかない・全文検索 (TritonnやSphinx)・GIS●InnoDBの利点(MyISAMの欠点)▲障害対応系・クラッシュしても再起動するだけでリカバリができる・クラッシュリカバリにかかる時間はテーブルサイズに比例するようなことはなく、コミット済みのデータは修復できる (巨大なMyISAMテーブルのREPAIRには数日単位で時間がかかることがある)・オンラインバックアップができる・INSERTやLOAD DATAなどを実行している途中でCtrl+Cでその更新系SQL文を止めても、テーブルは壊れないし、中途半端な状態で更新されることも無いし、スレーブが止まることも無い▲性能系・行レベルロックなので並列性が高い(MyISAMはテーブルロック)。またSELECTと更新系SQL文が競合しない。・主キー検索が高速 (クラスタ索引のため)・ダイレクトI/O(innodb_flush_method=O_DIRECT)を使えるためキャッシュ効率が高い・インデックスの追加/削除をするにあたってテーブルを再編成する必要がなく、そのインデックスだけを再構築するので効率が良い(InnoDB Plugin)・Insert Bufferという仕組みにより、セカンダリインデックスへのINSERT処理の効率がMyISAMよりも良い▲従来は欠点だったが、InnoDB Pluginによって改善されたもの・グループコミットが無効化されるため同時更新性能が著しく低下していた・I/Oスレッドが事実上読み書き1本ずつしか無かったため並列性が低く、RAIDやSSDを有効活用できなかった・CPUスケーラビリティが悪く、4CPUコアくらいまでしかスケールしなかった・同じ量のデータを投入してもテーブルサイズがMyISAMよりも倍以上大きくなることがある(InnoDB Pluginの圧縮機能を使うことで緩和する手がある)▲ほか・InnoDBでは外部キーが使える●MyISAMの利点・WHERE条件無しのSELECT COUNT(*)が一瞬で返る(InnoDBの場合はテーブルをなめる必要がある)・メモリにおさまらないほど巨大なテーブルのフルテーブルスキャン系の処理効率が良い(InnoDBではこうしたバッチ処理でバッファプールの中身が追い出されてしまうし、バッファプールの管理オーバーヘッドもあるが、MyISAMは専用のバッファプールを持たないので効率が良い)・OSコピーによってテーブルの移動が極めて簡単にできる・MERGEテーブルを使うことができる (InnoDBでも5.1のレンジパーティショニングを使えば十分なことは多い)・リードオンリーのテーブルであれば圧縮できる・ALTER TABLE ENABLE/DISABLE KEYSを使える。例えばインデックスなしの状態で高速にロードして、後からインデックスを有効化とかができる (InnoDB Pluginではインデックス単位の再構築ができるのでかなり緩和できる)・InnoDBはテーブルのオープン処理がシリアライズされるため、大量の数のテーブルを初回オープンするような処理がきつい▲ソリューションによって緩和できるもの・クラッシュ時に壊れる問題やリカバリ(REPAIR TABLE)の遅さは、生きているスレーブを使って復旧すれば解決できる・テーブルが巨大になることで引き起こされる性能問題は、小さなテーブルに分割することで解決できる　自分は、特別な事情が無い限り、5.1最新版に含まれるInnoDB Pluginを勧めています(*注)。ログ蓄積系のテーブルではMyISAMが良いと考えている方が結構多いのですが、MyISAMでは複数のクライアントから同じテーブルに対してINSERTをすれば競合してしまいますし、InnoDBのInsert BufferのようなI/O最適化の仕組みが無い(詳しくは「Linux-DBシステム構築/運用入門」の9章あたりを参考にしてください)ので、InnoDBに比べても処理効率が悪いです。MyISAMを活用する場合は、上に挙げたようなテクニックを使って問題を緩和するのが効果的です。　ちなみに、マスターをInnoDBにして、スレーブをMyISAMにするのは以前Postしたように特別な注意が必要です。(*注追加) InnoDB Pluginの現時点での位置づけはベータです。ただし、Dynamic/Compressedという特別なテーブルフォーマットを使わない限り、既存のInnoDBテーブルと互換性があるので、InnoDB Pluginを使いつつ、不安定な現象に遭遇したらパラメータを変えて通常のInnoDBに戻すことが可能です。追加インストールやインストールし直し等が必要ないという手軽さが魅力です。</description>
    <content:encoded><![CDATA[Twitterで話題になってたので簡単にまとめました。<br /><br />●MyISAMにしか無い機能を使いたい場合はMyISAMを使うしかない<br />・全文検索 (TritonnやSphinx)<br />・GIS<br /><br />●InnoDBの利点(MyISAMの欠点)<br />▲障害対応系<br />・クラッシュしても再起動するだけでリカバリができる<br />・クラッシュリカバリにかかる時間はテーブルサイズに比例するようなことはなく、コミット済みのデータは修復できる (巨大なMyISAMテーブルのREPAIRには数日単位で時間がかかることがある)<br />・オンラインバックアップができる<br />・INSERTやLOAD DATAなどを実行している途中でCtrl+Cでその更新系SQL文を止めても、テーブルは壊れないし、中途半端な状態で更新されることも無いし、スレーブが止まることも無い<br /><br />▲性能系<br />・行レベルロックなので並列性が高い(MyISAMはテーブルロック)。またSELECTと更新系SQL文が競合しない。<br />・主キー検索が高速 (クラスタ索引のため)<br />・ダイレクトI/O(innodb_flush_method=O_DIRECT)を使えるためキャッシュ効率が高い<br />・インデックスの追加/削除をするにあたってテーブルを再編成する必要がなく、そのインデックスだけを再構築するので効率が良い(InnoDB Plugin)<br />・Insert Bufferという仕組みにより、セカンダリインデックスへのINSERT処理の効率がMyISAMよりも良い<br /><br />▲従来は欠点だったが、InnoDB Pluginによって改善されたもの<br />・グループコミットが無効化されるため同時更新性能が著しく低下していた<br />・I/Oスレッドが事実上読み書き1本ずつしか無かったため並列性が低く、RAIDやSSDを有効活用できなかった<br />・CPUスケーラビリティが悪く、4CPUコアくらいまでしかスケールしなかった<br />・同じ量のデータを投入してもテーブルサイズがMyISAMよりも倍以上大きくなることがある(InnoDB Pluginの圧縮機能を使うことで緩和する手がある)<br /><br />▲ほか<br />・InnoDBでは外部キーが使える<br /><br /><br />●MyISAMの利点<br />・WHERE条件無しのSELECT COUNT(*)が一瞬で返る<br />(InnoDBの場合はテーブルをなめる必要がある)<br />・メモリにおさまらないほど巨大なテーブルのフルテーブルスキャン系の処理効率が良い<br />(InnoDBではこうしたバッチ処理でバッファプールの中身が追い出されてしまうし、バッファプールの管理オーバーヘッドもあるが、MyISAMは専用のバッファプールを持たないので効率が良い)<br />・OSコピーによってテーブルの移動が極めて簡単にできる<br />・MERGEテーブルを使うことができる (InnoDBでも5.1のレンジパーティショニングを使えば十分なことは多い)<br />・リードオンリーのテーブルであれば圧縮できる<br />・ALTER TABLE ENABLE/DISABLE KEYSを使える。例えばインデックスなしの状態で高速にロードして、後からインデックスを有効化とかができる (InnoDB Pluginではインデックス単位の再構築ができるのでかなり緩和できる)<br />・InnoDBはテーブルのオープン処理がシリアライズされるため、大量の数のテーブルを初回オープンするような処理がきつい<br /><br />▲ソリューションによって緩和できるもの<br />・クラッシュ時に壊れる問題やリカバリ(REPAIR TABLE)の遅さは、生きているスレーブを使って復旧すれば解決できる<br />・テーブルが巨大になることで引き起こされる性能問題は、小さなテーブルに分割することで解決できる<br /><br /><br />　自分は、特別な事情が無い限り、5.1最新版に含まれるInnoDB Pluginを勧めています(*注)。ログ蓄積系のテーブルではMyISAMが良いと考えている方が結構多いのですが、MyISAMでは複数のクライアントから同じテーブルに対してINSERTをすれば競合してしまいますし、InnoDBのInsert BufferのようなI/O最適化の仕組みが無い(詳しくは「Linux-DBシステム構築/運用入門」の9章あたりを参考にしてください)ので、InnoDBに比べても処理効率が悪いです。MyISAMを活用する場合は、上に挙げたようなテクニックを使って問題を緩和するのが効果的です。<br />　ちなみに、マスターをInnoDBにして、スレーブをMyISAMにするのは<a href="http://opendatabaselife.blogspot.com/2009/08/innodbmyisam.html">以前Postしたように</a>特別な注意が必要です。<br /><br />(*注追加) InnoDB Pluginの現時点での位置づけはベータです。ただし、Dynamic/Compressedという特別なテーブルフォーマットを使わない限り、既存のInnoDBテーブルと互換性があるので、InnoDB Pluginを使いつつ、不安定な現象に遭遇したらパラメータを変えて通常のInnoDBに戻すことが可能です。追加インストールやインストールし直し等が必要ないという手軽さが魅力です。<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/8317896764605662628-2291370513315457937?l=opendatabaselife.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21927&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21927&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Tue, 27 Oct 2009 10:32:00 +0000</pubDate>
    <dc:creator>Yoshinori Matsunobu</dc:creator>
    <category>mysql</category>
  </item>

  <item>
    <title>彼氏がMyISAM使ってた。別れたい…</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/kazuhooku/20091027/1256638805</guid>
    <link>http://d.hatena.ne.jp/kazuhooku/20091027/1256638805</link>
    <description>
			追記: マジメな比較はこちら：Open database life: MyISAMとInnoDBのどちらを使うべきか
			
			MyISAMだとPostgreSQLと並べられた時なんか恥ずかしいｗｗ
			下向いちゃうしｗｗ
			ウェブサイトにはせめてInnoDB使って欲しい・・・
			勉強会とかで発表されたら・・・・もう最悪ｗｗ
			せめて普通にトランザクションやMVCCぐらいは対応して欲しい。
			常識的に考えて欲しいだけなんです！
			MyISAMでテーブルロックしちゃった時の遅さとか分かる？
			あのね？たとえばピーク時10〜20並行ぐらいで書込みとか行くでしょ？
			それぞれ別の接続で来るわけじゃない？
			みんな普通にグループコミットやアシッドネス期待してるわけでしょ？
			MyISAMでテーブル壊れてリペアしてたら大恥かくでしょうがｗｗ
			
			じゃあ MyISAM はどういう用途に適しているのか。待て！　次号！*1
			参考: 彼氏が軽自動車に乗ってた。別れたい… 
		
		
			*1：詳しい人が解説してくれるらしいぉ ^o^
		</description>
    <content:encoded><![CDATA[<div>
			<p><b>追記: マジメな比較はこちら：<a href="http://opendatabaselife.blogspot.com/2009/10/myisaminnodb.html" target="_blank">Open database life: MyISAMとInnoDBのどちらを使うべきか</a></b></p>
			<blockquote>
			<p>MyISAMだとPostgreSQLと並べられた時なんか恥ずかしいｗｗ</p>
			<p>下向いちゃうしｗｗ</p>
			<p>ウェブサイトにはせめてInnoDB使って欲しい・・・</p>
			<p>勉強会とかで発表されたら・・・・もう最悪ｗｗ</p>
			<p>せめて普通にトランザクションやMVCCぐらいは対応して欲しい。</p>
			<p>常識的に考えて欲しいだけなんです！</p>
			<p>MyISAMでテーブルロックしちゃった時の遅さとか分かる？</p>
			<p>あのね？たとえばピーク時10〜20並行ぐらいで書込みとか行くでしょ？</p>
			<p>それぞれ別の接続で来るわけじゃない？</p>
			<p>みんな普通にグループコミットやアシッドネス期待してるわけでしょ？</p>
			<p>MyISAMでテーブル壊れてリペアしてたら大恥かくでしょうがｗｗ</p>
			</blockquote>
			<p>じゃあ MyISAM はどういう用途に適しているのか。<s>待て！　次号！</s><span><a href="http://d.hatena.ne.jp/kazuhooku/#f1" name="fn1" title="詳しい人が解説してくれるらしいぉ ^o^">*1</a></span></p>
			<p>参考: <a href="http://anond.hatelabo.jp/20081111000645" target="_blank">彼氏が軽自動車に乗ってた。別れたい… </a></p>
		</div>
		<div>
			<p><a href="http://d.hatena.ne.jp/kazuhooku/#fn1" name="f1">*1</a>：詳しい人が解説してくれるらしいぉ ^o^</p>
		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21928&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21928&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Tue, 27 Oct 2009 10:20:05 +0000</pubDate>
    <dc:creator>Kazuho Oku</dc:creator>
  </item>

  <item>
    <title>[mysql]MySQL 5.1.40 と MySQL 5.0.87 リリース</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20091027/p1</guid>
    <link>http://d.hatena.ne.jp/sakaik/20091027/p1</link>
    <description>　一週間ほど前に MySQL 5.1.40 が、そして今週はMySQL 5.0.87 がリリースされました。 　 ○MySQL 5.1.40 リリース http://www.mysql.gr.jp/frame/modules/news/article.php?storyid=153  ○MySQL 5.0.87 リリース http://www.mysql.gr.jp/frame/modules/news/article.php?storyid=154   　MySQL 5.0.87 は修正数も少なくな ...</description>
    <content:encoded><![CDATA[　一週間ほど前に MySQL 5.1.40 が、そして今週はMySQL 5.0.87 がリリースされました。 　 ○MySQL 5.1.40 リリース http://www.mysql.gr.jp/frame/modules/news/article.php?storyid=153  ○MySQL 5.0.87 リリース http://www.mysql.gr.jp/frame/modules/news/article.php?storyid=154   　MySQL 5.0.87 は修正数も少なくな ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21923&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21923&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Tue, 27 Oct 2009 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>[mysql]松信さんの奥さんのエントリがすごい</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20091027/p2</guid>
    <link>http://d.hatena.ne.jp/sakaik/20091027/p2</link>
    <description>　気づいたら twitter で MyISAM vs InnoDB の話題が盛り上がっていました。その流れで、奥さんの愛のある MyISAM 礼賛(?)の記事：  ○彼氏がMyISAM使ってた。別れたい… http://d.hatena.ne.jp/kazuhooku/20091027/1256638805  　勢いがあります。こういう文章をさくっと数分で書いてしまうセンスが羨ましい。 　末尾に「待て！　次号」とあり、その「次号」を松信さんがこれまた数分でさくっと。　すごい。  ○彼女が・・・   　 ...</description>
    <content:encoded><![CDATA[　気づいたら twitter で MyISAM vs InnoDB の話題が盛り上がっていました。その流れで、奥さんの愛のある MyISAM 礼賛(?)の記事：  ○彼氏がMyISAM使ってた。別れたい… http://d.hatena.ne.jp/kazuhooku/20091027/1256638805  　勢いがあります。こういう文章をさくっと数分で書いてしまうセンスが羨ましい。 　末尾に「待て！　次号」とあり、その「次号」を松信さんがこれまた数分でさくっと。　すごい。  ○彼女が・・・   　 ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21929&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21929&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Tue, 27 Oct 2009 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>Okyuu.comからインタビューを受けました</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-8317896764605662628.post-3415995515814849515</guid>
    <link>http://opendatabaselife.blogspot.com/2009/10/okyuucom.html</link>
    <description>　先日カカクコムさんが運営しているサイト「Okyuu.com」からインタビューを受け、その記事が公開されました。　私は幼少の頃から技術者魂全開、というキャラとは程遠く、気づいたらこの業界でDB技術系の仕事をしていた、という程度なのですが、趣味と仕事が完全に一致したという恵まれた方はむしろ少数派で、多くの方は生活のために(それと多少の興味と一致して)この業界で仕事をしているのだと思います。この業界はコードを書くのが趣味でなければ生きていけない、というプレッシャーをひしひしと感じさせますが、そうでない人にとっても活躍の場はあるのだ、という安心感を持っていただけると幸いです。　インタビュー記事について、少しだけ補足をしたいと思います。・お金を払うユーザーを大切にするのは当然ですが、無償で使うユーザーを無視しているわけではありません。そもそも無償で使うユーザーを無視するようではOSSビジネスは成立しません。多くの利用者が試し、時に地雷を踏みそれを修復するサイクルを繰り返すことで、ようやくお金を払っても良いかなという品質に達すると考えています。誰も使っていないプロダクト(地雷を踏むリスクが高い)にお金を払うユーザーは、昨今では非常に少ないのではないでしょうか。・第3者企業がOSS製品をさんざん利用した挙句、ちょっと機能を追加してクローズドソースにして「自社製品です」と言い張って販売するのは、私は「邪道」のビジネスだと考えています。もちろん程度問題で、ユーティリティライブラリ程度なら全然いいと思いますが、コアの機能がもろにOSSを使っているのなら、それを拡張してクローズドソースにして販売するくらいなら本家にフィードバックしろよ、と思うわけです。・OSSに貢献する道は、パッチを書くだけではありません。たとえば新バージョンのバグを見つけてバグレポート上で再現手順を報告するというのも立派な貢献です。こうしたバグ報告によって製品の品質は徐々に上がっていきます。その意味では、会社としてはお金を出せないしパッチを書くほどのスキルは無いけどOSSに貢献したい、というような方は、できるだけ新しいバージョンを積極的に使って、バグを見つけて報告するのが良いのではないかと思います。ただし、セキュリティ上の脆弱性に関しては、バグフィックスよりも先にBlog等で発信して一般に認知されたりすると、攻撃の対象になりかねないので気をつけて頂きたいと思います(MySQLのバグレポートでは、脆弱性の問題については、報告を受けた後に一般ユーザーが閲覧できないように権限設定されます)。</description>
    <content:encoded><![CDATA[　先日カカクコムさんが運営しているサイト「Okyuu.com」からインタビューを受け、その記事が<a href="http://okyuu.com/ja/special/engineer09-matsunobu">公開</a>されました。<br />　私は幼少の頃から技術者魂全開、というキャラとは程遠く、気づいたらこの業界でDB技術系の仕事をしていた、という程度なのですが、趣味と仕事が完全に一致したという恵まれた方はむしろ少数派で、多くの方は生活のために(それと多少の興味と一致して)この業界で仕事をしているのだと思います。この業界はコードを書くのが趣味でなければ生きていけない、というプレッシャーをひしひしと感じさせますが、そうでない人にとっても活躍の場はあるのだ、という安心感を持っていただけると幸いです。<br />　インタビュー記事について、少しだけ補足をしたいと思います。<br /><br />・お金を払うユーザーを大切にするのは当然ですが、無償で使うユーザーを無視しているわけではありません。そもそも無償で使うユーザーを無視するようではOSSビジネスは成立しません。多くの利用者が試し、時に地雷を踏みそれを修復するサイクルを繰り返すことで、ようやくお金を払っても良いかなという品質に達すると考えています。誰も使っていないプロダクト(地雷を踏むリスクが高い)にお金を払うユーザーは、昨今では非常に少ないのではないでしょうか。<br /><br />・第3者企業がOSS製品をさんざん利用した挙句、ちょっと機能を追加してクローズドソースにして「自社製品です」と言い張って販売するのは、私は「邪道」のビジネスだと考えています。もちろん程度問題で、ユーティリティライブラリ程度なら全然いいと思いますが、コアの機能がもろにOSSを使っているのなら、それを拡張してクローズドソースにして販売するくらいなら本家にフィードバックしろよ、と思うわけです。<br /><br />・OSSに貢献する道は、パッチを書くだけではありません。たとえば新バージョンのバグを見つけてバグレポート上で再現手順を報告するというのも立派な貢献です。こうしたバグ報告によって製品の品質は徐々に上がっていきます。その意味では、会社としてはお金を出せないしパッチを書くほどのスキルは無いけどOSSに貢献したい、というような方は、できるだけ新しいバージョンを積極的に使って、バグを見つけて報告するのが良いのではないかと思います。ただし、セキュリティ上の脆弱性に関しては、バグフィックスよりも先にBlog等で発信して一般に認知されたりすると、攻撃の対象になりかねないので気をつけて頂きたいと思います(MySQLのバグレポートでは、脆弱性の問題については、報告を受けた後に一般ユーザーが閲覧できないように権限設定されます)。<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/8317896764605662628-3415995515814849515?l=opendatabaselife.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21911&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21911&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Mon, 26 Oct 2009 11:17:00 +0000</pubDate>
    <dc:creator>Yoshinori Matsunobu</dc:creator>
    <category>mysql</category>
    <category>interview</category>
  </item>

  <item>
    <title>MySQL Clusterソースコード探検隊！</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-1906500952232920237.post-8100024635476926445</guid>
    <link>http://nippondanji.blogspot.com/2009/10/mysql-cluster_26.html</link>
    <description>これまで「MySQL Clusterの進化とその構造について」および「NDBカーネルブロックの種類」について説明した。今日はその続きとしてMySQL Clusterのソースコードについて紹介しようと思う。シグナルを交換し合うマルチプルステートマシンは間違いなくこれからの時代にフィットするアーキテクチャなので、MySQL Clusterに興味を持たれた方が「膨大なMySQL Clusterのソースコードを探検する場合にどの入り口から入ればいいのか」ということを判断する一助になればと思う。とりとめなく書いてるのであんまりまとまってないかも知れないが、その点は容赦して頂きたい。まず、ソースコードの入手方法であるが、これは最新のソースツリーをBazaarで入手する方法と、MySQLのWebページからダウンロードする方法の2つがある。Bazaarで入手するには、次のコマンドを実行すれば良い。（Bazaarを事前にインストールしておこう。）shell&amp;gt; bzr branch lp:~mysql/mysql-server/mysql-cluster-7.0するとカレントディレクトリ以下にソースコードがコピーされる。結構時間がかかるので注意しよう。MySQLのWebページからダウンロードするには、次のページをブラウザでアクセスしよう。http://dev.mysql.com/downloads/cluster.htmlするとプラットフォームの選択メニューが出てくるので、ZIP形式のソースコードが欲しければWindowsを、TAR形式のものが欲しければLinuxを選択しよう。一番小さいファイルがソースコードである。ソースコードのファイルはmysql-cluster-gpl-VERSION.tar.gzというような名前になっている。MySQL Clusterのソースコードが含まれる場所は次の2つである。src-top-dir/storage/ndbsrc-top-dir/sqlsrc-top-dirはソースコードのトップディレクトリ、つまりZIPまたはTARファイルを展開したときに作成されるディレクトリ（mysql-cluster-gpl-VERSIONというような名前のディレクトリ）のことである。storage/ndbにはndbdやndb_mgmdといったコマンドのソースコードが収められている。つまりSQLノードを除く全てのコマンドのソースコードはここにある。一方、sqlディレクトリにはSQLノードのソースコードが格納されている。ファイル名はha_ndbcluster*。（*はワイルドカード。）ここは元々mysqldのソースコードが収められているディレクトリなので、そこに居候しているのである。（将来的にはstorage/ndbへ移動したいらしいが、タスクの優先順位は低くなかなかそうならない。）肝心のNDBカーネルのソースコードはstorage/ndb以下にあるのでこちらを中心に説明する。ha_ndbcluster*には、ストレージエンジンとしてMySQL Clusterへアクセスする際に必要なソースコード、つまりmysqldがNDB APIを通じてNDBにアクセスするためのロジックが記述されているので、ストレージエンジンAPIおよびNDB API興味のある人は覗いて見るといいだろう。ここからは、NDBカーネルのソースコードを見る際のポイントについて列挙しよう。NDBカーネルのソースコードの位置は、storage/ndb/src/kernelである。main()関数を含むmain.cppはこのディレクトリである。ndbdの初期化プロセスについて知りたい場合には、main.cppを見よう。ヘッダファイル類はstorage/ndb/include/kernel配下に収められている。C++のヘッダファイルはstorage/ndb/src/kernel以下にも含まれているが、共通のヘッダファイルはこちらのディレクトリに含まれているので注意しよう。storage/ndb/src/kernel/vmには、PLEX仮想実行環境のソースコードが含まれている。最も重要なのはSimulatedBlock.[c|h]ppで、ここで定義されているSimulatedBLockクラスはこれらは全てのブロックの親クラスとなる。つまり、NDBDカーネル内の各ブロックは、SimulatedBlockクラスを継承しているのである。また、SimulatedBlockが交換するメッセージは、VMSignal.[c|h]ppで定義されている。（シグナルを表すクラスはSignalである。）面白いことに、SimulatedBlockは他のあらゆるカーネルブロックへ、sendSignal()関数を通じてシグナルを送信することが出来る。同じプロセス内のブロックであろうが、他のホストで動作しているブロックであろうが、同じ方法（関数）でシグナルを送信することが出来るのである。storage/ndb/src/kernel/blocksには各ブロックのソースコードが含まれている。ブロックごとにサブディレクトリに分かれているので見易いだろう。ここで定義されている各カーネルブロックは、上記の通りSimulatedBlockクラスを継承している。各カーネルブロックの動作を定義しているこのディレクトリは、NDBのソースコードの心臓部と言っていいだろう。storage/ndb/include/kernel/BlockNumbers.hには、各カーネルブロックのIDが定義されている。ブロック番号は16ビット符号無し整数なのだが、同じく16ビット符号無し整数であるノードIDと組み合わせることで、32ビットの符号無し整数としてクラスタ全体を通じたID（BlockReference）を合成することが出来る。storage/ndb/include/kernel/RefConvert.hppにはノードIDとブロック番号からBlockReferenceへ変換するロジックおよびその逆が定義されている。（ただのビット演算だけどね！）storage/ndb/src/kernel/SimBlockList.cppには、作成したカーネルブロックのインスタンス化と、そのインスタンスへのポインタをリストにして保管しておくためのロジックが記述されている。ただし、NDBカーネルの各ブロックはインスタンス化された段階ではまだ初期化されず、その後STTORシグナルを受け取った時点で初期化が始まる点には注意したい。storage/ndb/include/kernel/GlobalSignalNumbers.hでは、各シグナルにつけられた番号が記述されている。実に700種類以上のシグナルが定義されている！（2009年10月現在）storage/ndb/include/kernel/signaldataディレクトリには、シグナルにおいて送信されるデータ（ペイロード）を定義するクラスのソースコードが格納されている。シグナルが送信するデータはフリーフォーマット（単なるワード列）なので、頻繁に利用されるデータについてはその構造が定義されているのである。storage/ndb/src/common/transporterディレクトリには、トランスポーターに関するソースコードが格納されている。トランスポーターとは、MySQL Clusterの各ノード同士が通信し合うための仮想的なインターフェイスである。これにより、通信する実際のプロトコル（TCP/IPなのかSCIなのか）に因らないロジックの記述が可能になる。storage/ndb/src/mgmsrvディレクトリには、管理ノードのソースコードが格納されている。特に重要なのはstorage/ndb/src/mgmsrv/ConfigInfo.cppで、このファイルには各種設定パラメーターとそのデフォルト値に関する記述がなされている。また、storage/ndb/src/mgmclientにはndb_mgmコマンドのソースコードが、storage/ndb/src/mgmapiにはNDB MGM API（設定情報をやり取りするためのAPI）のソースコードが格納されている。storage/ndb/src/ndbapiディレクトリには、NDB APIに関するソースコードが格納されている。そんなわけでMySQL Clusterのソースコードのレイアウトについてとりとめもなく紹介してみた。「よし、ソースコードを見るか！」と思った時に参考にして頂けると幸いである。</description>
    <content:encoded><![CDATA[これまで「<a href="http://nippondanji.blogspot.com/2009/10/mysql-cluster.html">MySQL Clusterの進化とその構造について</a>」および「<a href="http://nippondanji.blogspot.com/2009/10/mysql-cluster_23.html">NDBカーネルブロックの種類</a>」について説明した。今日はその続きとしてMySQL Clusterのソースコードについて紹介しようと思う。シグナルを交換し合うマルチプルステートマシンは間違いなくこれからの時代にフィットするアーキテクチャなので、MySQL Clusterに興味を持たれた方が「膨大なMySQL Clusterのソースコードを探検する場合にどの入り口から入ればいいのか」ということを判断する一助になればと思う。とりとめなく書いてるのであんまりまとまってないかも知れないが、その点は容赦して頂きたい。<br /><br />まず、ソースコードの入手方法であるが、これは最新のソースツリーをBazaarで入手する方法と、MySQLのWebページからダウンロードする方法の2つがある。Bazaarで入手するには、次のコマンドを実行すれば良い。（Bazaarを事前にインストールしておこう。）<br /><br /><b>shell&gt; bzr branch lp:~mysql/mysql-server/mysql-cluster-7.0</b><br /><br />するとカレントディレクトリ以下にソースコードがコピーされる。結構時間がかかるので注意しよう。<br /><br />MySQLのWebページからダウンロードするには、次のページをブラウザでアクセスしよう。<br /><br /><a href="http://dev.mysql.com/downloads/cluster.html"><b>http://dev.mysql.com/downloads/cluster.html</b></a><br /><br />するとプラットフォームの選択メニューが出てくるので、ZIP形式のソースコードが欲しければWindowsを、TAR形式のものが欲しければLinuxを選択しよう。一番小さいファイルがソースコードである。ソースコードのファイルはmysql-cluster-gpl-VERSION.tar.gzというような名前になっている。<br /><br />MySQL Clusterのソースコードが含まれる場所は次の2つである。<br /><br /><ul><li>src-top-dir/storage/ndb</li><li>src-top-dir/sql</li></ul><br />src-top-dirはソースコードのトップディレクトリ、つまりZIPまたはTARファイルを展開したときに作成されるディレクトリ（mysql-cluster-gpl-VERSIONというような名前のディレクトリ）のことである。<br /><br />storage/ndbにはndbdやndb_mgmdといったコマンドのソースコードが収められている。つまりSQLノードを除く全てのコマンドのソースコードはここにある。一方、sqlディレクトリにはSQLノードのソースコードが格納されている。ファイル名はha_ndbcluster*。（*はワイルドカード。）ここは元々mysqldのソースコードが収められているディレクトリなので、そこに居候しているのである。（将来的にはstorage/ndbへ移動したいらしいが、タスクの優先順位は低くなかなかそうならない。）肝心のNDBカーネルのソースコードはstorage/ndb以下にあるのでこちらを中心に説明する。ha_ndbcluster*には、ストレージエンジンとしてMySQL Clusterへアクセスする際に必要なソースコード、つまりmysqldがNDB APIを通じてNDBにアクセスするためのロジックが記述されているので、ストレージエンジンAPIおよびNDB API興味のある人は覗いて見るといいだろう。<br /><br />ここからは、NDBカーネルのソースコードを見る際のポイントについて列挙しよう。<br /><br /><ul><li><b>NDBカーネルのソースコードの位置は、storage/ndb/src/kernelである。</b>main()関数を含むmain.cppはこのディレクトリである。ndbdの初期化プロセスについて知りたい場合には、main.cppを見よう。</li><li><b>ヘッダファイル類はstorage/ndb/include/kernel配下に収められている。</b>C++のヘッダファイルはstorage/ndb/src/kernel以下にも含まれているが、共通のヘッダファイルはこちらのディレクトリに含まれているので注意しよう。</li><li><b>storage/ndb/src/kernel/vmには、PLEX仮想実行環境のソースコードが含まれている。</b>最も重要なのはSimulatedBlock.[c|h]ppで、ここで定義されているSimulatedBLockクラスはこれらは全てのブロックの親クラスとなる。つまり、NDBDカーネル内の各ブロックは、SimulatedBlockクラスを継承しているのである。また、SimulatedBlockが交換するメッセージは、VMSignal.[c|h]ppで定義されている。（シグナルを表すクラスはSignalである。）面白いことに、SimulatedBlockは他のあらゆるカーネルブロックへ、sendSignal()関数を通じてシグナルを送信することが出来る。同じプロセス内のブロックであろうが、他のホストで動作しているブロックであろうが、同じ方法（関数）でシグナルを送信することが出来るのである。</li><li><b>storage/ndb/src/kernel/blocksには各ブロックのソースコードが含まれている。</b>ブロックごとにサブディレクトリに分かれているので見易いだろう。ここで定義されている各カーネルブロックは、上記の通りSimulatedBlockクラスを継承している。各カーネルブロックの動作を定義しているこのディレクトリは、NDBのソースコードの心臓部と言っていいだろう。</li><li><b>storage/ndb/include/kernel/BlockNumbers.hには、各カーネルブロックのIDが定義されている。</b>ブロック番号は16ビット符号無し整数なのだが、同じく16ビット符号無し整数であるノードIDと組み合わせることで、32ビットの符号無し整数としてクラスタ全体を通じたID（BlockReference）を合成することが出来る。storage/ndb/include/kernel/RefConvert.hppにはノードIDとブロック番号からBlockReferenceへ変換するロジックおよびその逆が定義されている。（ただのビット演算だけどね！）</li><li><b>storage/ndb/src/kernel/SimBlockList.cpp</b>には、作成したカーネルブロックのインスタンス化と、そのインスタンスへのポインタをリストにして保管しておくためのロジックが記述されている。ただし、NDBカーネルの各ブロックはインスタンス化された段階ではまだ初期化されず、その後STTORシグナルを受け取った時点で初期化が始まる点には注意したい。</li><li><b>storage/ndb/include/kernel/GlobalSignalNumbers.h</b>では、各シグナルにつけられた番号が記述されている。実に700種類以上のシグナルが定義されている！（2009年10月現在）</li><li><b>storage/ndb/include/kernel/signaldata</b>ディレクトリには、シグナルにおいて送信されるデータ（ペイロード）を定義するクラスのソースコードが格納されている。シグナルが送信するデータはフリーフォーマット（単なるワード列）なので、頻繁に利用されるデータについてはその構造が定義されているのである。</li><li><b>storage/ndb/src/common/transporterディレクトリには、トランスポーターに関するソースコードが格納されている。</b>トランスポーターとは、MySQL Clusterの各ノード同士が通信し合うための仮想的なインターフェイスである。これにより、通信する実際のプロトコル（TCP/IPなのかSCIなのか）に因らないロジックの記述が可能になる。</li><li><b>storage/ndb/src/mgmsrvディレクトリ</b>には、管理ノードのソースコードが格納されている。特に重要なのは<b>storage/ndb/src/mgmsrv/ConfigInfo.cpp</b>で、このファイルには各種設定パラメーターとそのデフォルト値に関する記述がなされている。また、storage/ndb/src/mgmclientにはndb_mgmコマンドのソースコードが、storage/ndb/src/mgmapiにはNDB MGM API（設定情報をやり取りするためのAPI）のソースコードが格納されている。</li><li><b>storage/ndb/src/ndbapiディレクトリ</b>には、NDB APIに関するソースコードが格納されている。</li></ul>そんなわけでMySQL Clusterのソースコードのレイアウトについてとりとめもなく紹介してみた。「よし、ソースコードを見るか！」と思った時に参考にして頂けると幸いである。<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1906500952232920237-8100024635476926445?l=nippondanji.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21905&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=21905&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Mon, 26 Oct 2009 00:32:00 +0000</pubDate>
    <dc:creator>Mikiya Okuno</dc:creator>
    <category>mysql cluster</category>
    <category>mysql</category>
  </item>

</channel>
</rss>
