MySQLのDATETIME型へインデックスをつける場合注意が必要。
例えばこんなSQLではインデックスが使用されない。
SELECT * FROM `table` WHERE `datetime` LIKE '2009-05-17%'
検索結果は2009-05-17分全てが抽出されるが、フルスキャンがかかる。
この場合、以下のようなSQLが良い。
SELECT * FROM `table`
WHERE `date_time` BETWEEN '2009-05-17' AND '2009-05-17' + INTERVAL 1 DAY
実行時間計測の例
行数:13,776行
データ:2,935KB
インデックス:datetime
SELECT SUM( `col` ) FROM `table`
WHERE `datetime` LIKE '2009-05-17%'
フルスキャン
実行時間:0.0235 秒
SELECT SUM( `col` ) FROM `table`
WHERE DATE(datetime) = '2009-05-17'
フルスキャン
実行時間:0.0383 秒
SELECT SUM( `col` ) FROM `table`
WHERE `date_time` BETWEEN '2009-05-17' AND '2009-05-17' + INTERVAL 1 DAY
インデックス使用
実行時間:0.0009 秒
More from my site
CentOS5.3 PostfixをMySQL対応にする 2013-01-13追記
MySQL対応のPostfixはCentOS Plusリポジトリを使えばyumでupdate出来るみたい。こっちの方がいいね。
CentOS Plusリポジトリを有効にする
# vi /etc/yum.repos.d/CentOS-Base.repo
[centosplus]
name=CentOS-$releasever […]
MySQL で年月日等の日付別に集計する いまさら月次集計や年毎の集計など
集計をする際は、主にGROUP BYを多く用いる。
YEAR(), MONTH(), DAY(), DAYNAME(), EXTRACT()が便利。
WHERE で条件しぼるんじゃないらしい(ヲイ)
2010-05 2010-06 等で年月別の集計なら、
SELECT EXTRACT(YEAR_MONTH […]
DBIx::Skinny の resultset を使って変な ORDER BY 句を使えるかの実験 WHERE id IN(4,3,1) OREDER BY FIELD(id,4,3,1) こんなSQLの書き方があったのか! RT: MySQL - SELECT ... WHERE id IN (..) - correct orde stackoverflow.com/questions/5090…— クリックテクスさん (@clicktx) […]
DBI & MySQLでカウントする $COUNT = $dbh->selectrow_array("SELECT COUNT(*) FROM `テーブル名` WHERE `カラム` = '条件'");
全文検索したいからMacPortsでMySQL5.5とmroongaをインストール…make失敗…orz…となったけどなんとか入った ※一番下の追記にありますが、Homebrewでインストールできるようになってます(2012/5/29リリース)
MySQL5.5のインストール
MANPでMySQL使えるんだけど、mroongaを(ローカルテストでも)使いたいので別にMySQLをインストールする。
ただしMySQLのバージョンは5.5をインストールしたいのでコマンドはこんな感じに。
mys […]
DBIでMysql を使う時の文字コード指定 接続時
my $dbh = DBI->connect('DBI:mysql:database=sandbox;host=localhost;mysql_read_default_file=/etc/mysql/my.cnf',qw/id password/,);
または接続後に
$dbh->{ mysql_enable_utf8 } = […]
Filed under: MySQL
Trackback Uri
最近のコメント