<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Apelog &#187; mysql</title>
	<atom:link href="http://blog.apecell.com/tag/mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.apecell.com</link>
	<description>Apecell's blog by Design</description>
	<lastBuildDate>Tue, 22 Jun 2010 07:08:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MySQLでインデックスを使わなくなるケース</title>
		<link>http://blog.apecell.com/2008/01/22/id/30</link>
		<comments>http://blog.apecell.com/2008/01/22/id/30#comments</comments>
		<pubDate>Mon, 21 Jan 2008 15:00:00 +0000</pubDate>
		<dc:creator>design</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://blog.apecell.com/1970/01/01/30</guid>
		<description><![CDATA[MySQLではインデックスを使用しても30%以上のレコードにアクセスしなければならない時インデックスは使用されない。が、LIMIT句があればインデックスを使用する。

MySQL では利用可能な場合でもインデックスが使用されない場合があることに注意してください。この一例として、インデックスの使用によって、MySQL がテーブルの 30% を超えるレコードにアクセスする必要が生じる場合が挙げられます（この場合は、必要なシークが大幅に減少するため、テーブルスキャンのほうが高速になる可能性が高くなります）。 ただしこのクエリに、レコードの一部のみを取り出す LIMITが使用されている場合、結果で返される少数のレコードを迅速に検索できるため、MySQL はインデックスを使用します。
6.4.5. MySQLにおけるインデックスの使用
例えば&#8217;2007-01-01 &#60; register_date &#60; 2007-12-31&#8242;な数百万件データがありregister_dateにインデックスを張っているものとして、以下のSQLの条件の日付を進めていくと急にインデックスが効かなくなる。
SELECT * FROM `foo` WHERE `register_date` &#60; '2007-01-01'
知っていればどうという事はないものの何も考えず実装してしまうとデータ量が増えると予想外の時間が掛ってしまう時があるかもしれない。データ量を増やしたテストとexplainは重要。
データ量が増えるなら差分のみを対象に出来る設計にした方が良いと思う。
]]></description>
			<content:encoded><![CDATA[<p>MySQLではインデックスを使用しても30%以上のレコードにアクセスしなければならない時インデックスは使用されない。が、LIMIT句があればインデックスを使用する。</p>
<blockquote title="6.4.5. MySQLにおけるインデックスの使用" cite="http://dev.mysql.com/doc/refman/5.1/ja/mysql-indexes.html">
<p>MySQL では利用可能な場合でもインデックスが使用されない場合があることに注意してください。この一例として、インデックスの使用によって、MySQL がテーブルの 30% を超えるレコードにアクセスする必要が生じる場合が挙げられます（この場合は、必要なシークが大幅に減少するため、テーブルスキャンのほうが高速になる可能性が高くなります）。 ただしこのクエリに、レコードの一部のみを取り出す LIMITが使用されている場合、結果で返される少数のレコードを迅速に検索できるため、MySQL はインデックスを使用します。</p>
<p><cite><a href="http://dev.mysql.com/doc/refman/5.1/ja/mysql-indexes.html">6.4.5. MySQLにおけるインデックスの使用</a></cite></p></blockquote>
<p>例えば&#8217;2007-01-01 &#60; register_date &#60; 2007-12-31&#8242;な数百万件データがありregister_dateにインデックスを張っているものとして、以下のSQLの条件の日付を進めていくと急にインデックスが効かなくなる。</p>
<pre name="code" class="sql">SELECT * FROM `foo` WHERE `register_date` &lt; '2007-01-01'</pre>
<p>知っていればどうという事はないものの何も考えず実装してしまうとデータ量が増えると予想外の時間が掛ってしまう時があるかもしれない。データ量を増やしたテストとexplainは重要。</p>
<p>データ量が増えるなら差分のみを対象に出来る設計にした方が良いと思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apecell.com/2008/01/22/id/30/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PEAR::MDB2_Driver_mysqliとSJIS</title>
		<link>http://blog.apecell.com/2007/09/21/id/9</link>
		<comments>http://blog.apecell.com/2007/09/21/id/9#comments</comments>
		<pubDate>Thu, 20 Sep 2007 15:00:00 +0000</pubDate>
		<dc:creator>design</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[Program]]></category>
		<category><![CDATA[charaset]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.apecell.com/1970/01/01/9</guid>
		<description><![CDATA[PEAR::MDB2のmysqliドライバを使用してキャラクタセットにSJISを使う時の注意。
SET NAMES sjis;
上記SQLの発行だけだと（cp932でも）プレースホルダのエスケープが上手く行われない場合がある。問題が起こるのはプレースホルダの引数に渡した文字の最終文字が特定の文字の場合。
以下の文字が該当し共通点は2バイト目が0&#215;5c（ASCIIコードのに該当）なのでSQLのエスケープ処理で「&#8217;」によって囲まれても「&#8217;」自体がエスケープされてしまいsyntax errorになる。
― ソ Ы ? 噂 浬 欺 圭 構 蚕 十 申 曾 箪 貼 能 表 暴 予 禄
喀 媾 彌 拿 杤 歃 濬 畚 秉 綵 臀 藹 觸 軆 鐔 饅 鷭 ? 薌 硃 菑
mysqliにはmysqli_set_charset系のクライアントキャラクタセットを変更する関数・メソッドが用意されていて、それを利用しキャラクタセットを変更すればmysqli_real_escape_string関数が正しく2バイト目を判別するようになる。
変更にはmysqli接続オブジェクトが必要になるので取得して変更。

/**
 * @var $mdb2 MDB2
 */
$mdb2-&#62;getConnection()-&#62;set_charset('sjis');

これで上の文字列が通れば大丈夫。MDB2.phpの読み込み重い･･･。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://pear.php.net/package/MDB2" target="_blank">PEAR::MDB2</a>のmysqliドライバを使用してキャラクタセットにSJISを使う時の注意。</p>
<pre name="code" class="sql">SET NAMES sjis;</pre>
<p>上記SQLの発行だけだと（cp932でも）プレースホルダのエスケープが上手く行われない場合がある。問題が起こるのはプレースホルダの引数に渡した文字の最終文字が特定の文字の場合。</p>
<p>以下の文字が該当し共通点は2バイト目が0&#215;5c（ASCIIコードのに該当）なのでSQLのエスケープ処理で「&#8217;」によって囲まれても「&#8217;」自体がエスケープされてしまいsyntax errorになる。</p>
<pre>― ソ Ы ? 噂 浬 欺 圭 構 蚕 十 申 曾 箪 貼 能 表 暴 予 禄
喀 媾 彌 拿 杤 歃 濬 畚 秉 綵 臀 藹 觸 軆 鐔 饅 鷭 ? 薌 硃 菑</pre>
<p>mysqliには<a href="http://jp2.php.net/manual/ja/function.mysqli-set-charset.php" target="_blank">mysqli_set_charset</a>系のクライアントキャラクタセットを変更する関数・メソッドが用意されていて、それを利用しキャラクタセットを変更すれば<a href="http://jp2.php.net/manual/ja/function.mysqli-real-escape-string.php" target="_blank">mysqli_real_escape_string</a>関数が正しく2バイト目を判別するようになる。</p>
<p>変更にはmysqli接続オブジェクトが必要になるので取得して変更。</p>
<pre name="code" class="php">
/**
 * @var $mdb2 MDB2
 */
$mdb2-&gt;getConnection()-&gt;set_charset('sjis');
</pre>
<p>これで上の文字列が通れば大丈夫。MDB2.phpの読み込み重い･･･。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apecell.com/2007/09/21/id/9/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
