MySQL



2009 10月29日

MySQL4.xでは大丈夫だったけど、MySQL5.xに移行してから起こった出来事。

整数型カラムをUNSIGNEDして利用している時、負の数にならないのをいい事に0から減算して負の数の場合は0と自動で処理してくるものだと思っていた。(MySQL4.x時にはそのように処理されていた。)

本当はプログラム側で処理するべきなのかもしれないけれど、楽してそのようなスクリプトを書いていた。

で、先日MySQL5.xの環境に移行したらデータがおかしくなっていた。

とてつもなく大きな数字となっており???状態。

どうやら、UNSIGNEDしているカラムが0で、そこから1を引くと4294967295のような値になってしまうようだ。

これを回避するにはコマンドラインオプションで

–sql-mode=NO_UNSIGNED_SUBTRACTION

とするか、SQL発行時に

SET SQL_MODE=’NO_UNSIGNED_SUBTRACTION’;

とすると大丈夫のようだ。

参考: http://mlog.euqset.org/archives/ml@mysql.gr.jp/14844.html







2009 10月2日

yumでインストールされていたらアンインストール

yum erase postfix

ダウンロード

最新版の確認(/5.x/centosplus/SRPMS/より)

rpm -ivh http://ftp.riken.jp/Linux/centos/5.4/centosplus/SRPMS/postfix-2.3.3-2.1.centos.mysql_pgsql.src.rpm

コンパイル前の下準備

Postfix をMySQL対応にするためpostfix.specを編集。

cd /usr/src/redhat/SPECS/
vi postfix.spec
..
%define MYSQL 1 ←確認(0なら1に修正)
..

コンパイル

srpmからrpmを作成する。

rpmbuild -bb postfix.spec

インストール

出来上がったRPMをインストールする。

cd /usr/src/redhat/RPMS/i386/
rpm -Uvh postfix-2.3.3-2.1.centos.mysql_pgsql.i386.rpm

yumの自動アップデートから外す

yum update で postfix* なパッケージがアップデートされなくなる。

これをしないとyumの自動アップデート時にMySQL非対応に戻ってしまう。

vi /etc/yum.conf
 exclude=postfix* ←最終業に追記

↑手動でもやりましたけど
Postfixをyumでアップデートしてしまった orz…







2009 5月18日

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 秒