人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

mysqlのキーについて教えてください。

たとえばvarcharで定義されたカラム(body)に、
キーを張った場合、
100万件程度のレコードがあるテーブルでselectする際に、
条件句で、
(a) body = '123'
(b) body = 123

と記述すると、
(a)のケースではすぐに結果が来ますが、
(b)のケースでは6秒程度かかります。

カラムがintなどの数値型であれば問題ないようです。

これはどういった仕組みによるものでしょうか??


また、
perlのDBIモジュールを使っていますが、
その際は
(a)と(b)どちらで条件句はしてされるのでしょうか?

●質問者: the_yakisoba
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:BODY DBI MySQL Perl SELECT
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● pahoo
●23ポイント

データ型変換(cast)によるオーバーヘッドだと思います。

(a) body = '123'

(b) body = 123

(a) のケースでは、そのまま文字列データ型として扱うことができるので、そのままindex検索しているはずです。

(b) のケースは body に数値型(おそらくint型)として格納されるので、いったん int⇒varchar のデータ型変換を行う必要があります。型変換は逐次実行なので、index keyの効果がまったく出ていないと思われます。

◎質問者からの返答

ご回答ありがとうございます。

逆にintなどの数値型のカラムに対しては、

(a)も(b)もindexが使えているようなのですが、

この場合はvarchar =>intの変換は行われないのでしょうか?


2 ● pahoo
●23ポイント

逆にintなどの数値型のカラムに対しては、

(a)も(b)もindexが使えているようなのですが、

この場合はvarchar =>intの変換は行われないのでしょうか?

これは Perl のコンテキストの問題です。


Perl は、10進整数文字([0-9])のみのスカラー列があると、クォーテーションで囲もうが囲むまいが、数値コンテキストとして評価されます。上記の例では、(a) も (b) も int型として body に格納されています。

したがって、MySQLの方のカラムの型が int であれば、型変換は発生しません。


参考サイト

◎質問者からの返答

ご回答ありがとうございます。

こちらはperlのプログラムで試してみたのではなく、

コマンドライン上でSQLを打ってみたケースで、

int型の場合は(a)も(b)も問題がありませんでした。


3 ● ken33jp
●22ポイント

>これはどういった仕組みによるものでしょうか??

>(a) body = '123'

>(b) body = 123

この例だと、本当は(B) はSQLの文法として間違ってるわけ。

>カラムがintなどの数値型であれば問題ないようです。

当たり前。

勉強しなおしてきてください。


4 ● chuken_kenkou
●22ポイント

本来、定数を「'」(単一引用符)で囲んだものは、文字定数です。

しかし、文字定数が、0?9のみで構成されていて、格納対象がintなどの数値のデータ型の場合、

自動的に数値←→文字の変換をしてくれるRDBMSも存在します。MySQLも、その一つです。

利用者側にとっては、数値と文字を区別せず使用できるので、便利と感じる人も

いるようです。

しかし、RDBMS側でのデータ型変換は、扱うデータ量が増えれば増える程、オーバーヘッドになります。

また、数値と文字は区別するものということに慣れている人から

見れば、違和感があったり、素人の使い方と感じます。

「数値と文字の変換」のオーバーヘッド以外には、サーバ起動後、最初の実行と2回目以降の実行では、

データがメモリ上にキャッシュ(バッファリング)されていて、性能向上したように見える場合もあります。

http://q.hatena.ne.jp/だみー

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ