<?xml version="1.0" encoding="UTF-8" ?>
<entry
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"
	xml:lang="ja-JP"
>
	<title>where 句に関数を使うとインデックスが使われない罠</title>
	<id>tag:txqz.net,2006-11-08:blog/2006/11/08/1006</id>
	<link rel="self" href="http://txqz.net/blog/2006/11/08/1006.atom"/>
	<link rel="alternate" type="application/rss+xml" href="http://txqz.net/blog/2006/11/08/1006.rdf"/>
	<link rel="alternate" type="application/xhtml+xml" href="http://txqz.net/blog/2006/11/08/1006.xhtml"/>
	<link rel="alternate" type="text/html" href="http://txqz.net/blog/2006/11/08/1006.html"/>
	<link rel="contents" href="http://txqz.net/blog/2006/11/08/.atom" title="2006年11月8日"/>
	<link rel="first" href="http://txqz.net/blog/2001/08/04/0001.atom" title="地球空冷化"/>
	<link rel="prev" href="http://txqz.net/blog/2006/11/08/0948.atom" title="ブラスター目覚まし効果なし"/>
	<link rel="next" href="http://txqz.net/blog/2006/11/08/2255.atom" title="愛環の待ち合わせ"/>
	<link rel="last" href="http://txqz.net/blog/2008/12/19/2152.atom" title="浜松市街地を通り抜けて、ムーンライトながら～の思い出"/>
	<author>
		<name>陽坂智佐</name>
		<email>spambasket@txqz.net</email>
	</author>
	<content type="xhtml">
		<div xmlns="http://www.w3.org/1999/xhtml">
<p><a href="http://dev.mysql.com/doc/refman/4.1/ja/date-and-time-functions.html" title="MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.3.4 日付と時刻関数">MySQL 4.1 リファレンスマニュアル の 「日付と時刻関数」</a>には、<q title="MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.3.4 日付と時刻関数" cite="http://dev.mysql.com/doc/refman/4.1/ja/date-and-time-functions.html">このクエリでは、過去 30 日以内の日付の <code class="literal">date_col</code> 値を持つすべてのレコードが選択されます</q>として <code class="mysql">SELECT something FROM tbl_name WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) &lt;= 30;</code> という SQL 文が紹介されているけれども、これって INDEX が使われないわけで。</p>
<p>30日前の日付が他で分かるなら、それを BETWEEN で指定してあげれば、type が range なインデックスが使われる。だから、たとえば <code class="mysql">SELECT something FROM tbl_name WHERE date_col BETWEEN DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -30 DAY),'%Y-%m-%d 00:00:00') AND DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59')</code> とすればインデックスを使いつつ過去30日以内レコードを選択できるかなと思った。まぁ、データの量によっては無理してインデックスを使う必要もないわけなのだけれども。</p>
		</div>
	</content>
	<category term="MySQL"/>
	<category term="インデックス"/>
	<trackback:ping>http://txqz.net/blog/2006/11/08/1006/tb</trackback:ping>
	<published>2006-11-08T10:06:00+09:00</published>
	<updated>2007-04-08T17:35:58+09:00</updated>
	<rights>Attribution-Noncommercial-Share Alike 3.0 Unported</rights>
</entry>