MySQLの細かいお話※初心者向け

さて、配属されて2週間たった訳ですが、諸事情のせいで先週しか働いていない気がしますね。

細かい仕事がいろいろとあって達成すべき仕事を達成出来ていない感じがしますが、7月中の目標タスクは早ければ今週中に終わりそうです。

先週の頭には

 

上司「かばちゃん仕事終わりそう?」

かば「いやー、まだ分からないんですけど、がんばります」

上司「いや、終わらなかったら困るんだけど」

かば「すごいがんばります」

上司「いや、終わらなかったらどうするの?」

かば「謝罪します」

上司「仕事なんだから、謝られても困るんだけど笑」

 

みたいな感じで割と詰められまして、さすがにびびった俺は先週本気を出した結果、明らかに終わりそうな雰囲気になって来たため、「かばちゃん仕事終わりそうだねー^^」と言われ、金曜日に馬鹿みたいに仕事を投げられて、なんだかんだまた今月は忙しくなりそうです。

 

さて、先週はデータの抽出のためにSQL分のお願いを少しずつされました。

自分はSQLに関しては割と中級者くらいなんじゃないかと思っていたのですが、上司からいろいろとアドバイスを頂いたので、備忘録がてらなんとなく書いておきます。

 

数字をint型ではなくvarchar型で入れている理由

→入力の最初の0が消えてしまうケースがある。09011111111が90111111111になっちゃうんですよね。

メモリ容量的にchar型の方がじゃないかと思ったんですが、市外局番の場合は桁数が違う事もあり、varcharを採用するケースがあるらしいです。

参考URL*http://okwave.jp/qa/q7185591.html

 

boolean型とtinyint型について

→tinyint(1) = boolean らしい。

booleanはtinyintのエイリアスらしく、それを採用するならエイリアスを読み込まないtinyintを採用した方がいいらしい。

参考URL*http://okwave.jp/qa/q7185591.html

 

長いwhere句やテーブル名を使うときはエイリアスを有効活用しようね^^;

→例えば以下のSQL文があったとします

mysql > SELECT  * FROM user_basic_information,user_detail_infromation

              WHERE user_basic_information.id = user_detail_infromation.id

              AND user_basic_information.name = 'kaba_clone',

              AND user_basic_infromation.delete_flg = 0,

              AND user_detail_infromation.delete_flg = 0;

まあなんとも長くて気持ち悪い文ですよね。こいつをエイリアスを使うと

mysql > SELECT  * FROM user_basic_information as b,user_detail_infromation as d

              WHERE b.id = d.id

              AND b.name = 'kaba_clone',

              AND b.delete_flg = 0,

              AND d.delete_flg = 0;

と簡潔に、かつ分かりやすく記述出来ますね。っていうお話です。

エイリアス自体は知っていたんですが、なかなか使おうってなる場面が少なく横着していたのですが、データの抽出やらでSQL書く機会が多くなって来たので、この辺の知識も貯えておこうと思います。

 

論理削除と物理削除について

→いらないデータはどうするの?って言う話です。

物理削除は不要なデータをdeleteしちゃうことで、論理削除は↑の例のようにdelete_flgを設置して、論理上削除されたデータかどうかを参照して有効なデータかどうかを判別して使います。

会員情報等の頻繁にクエリが送信されるテーブルにアクセス数を減らすためや、なんやらの関係で論理削除や物理削除が選ばれたりするらしいです。

僕個人的にはオペレーションミスを割けるために論理削除の方がスマートなんじゃないかと思ってます。

参考URL*http://www.dollpaper.com/info/227.html

 

Where句の順序によって速度が変わるのか?

MySQLオプティマイザがクエリを解釈して最も効率のいいように検索をかけてくれるとのことですが、「MySQLの事を考えて、厳しい条件文から順番に書いていくように。」と上司に言われました。

なるほど、なるほどと思っていろいろと調べてみたのですが、どうも怪しいです。

参考URL*http://d.hatena.ne.jp/mitaina/20090907/1252325068

まあこういうときはマニュアル読むのが一番ですね。

参考URL*http://dev.mysql.com/doc/refman/5.1/ja/controlling-optimizer.html

文章をだらっと読んだ感じでは、オプティマイザががんばってくれるからおkみたいなノリなんですけど、

一方で、オプティマイザはいくつかのプランをスキップするため、最適プランを見逃す可能性もあります。

 

という文章から、やっぱり上司の言う事は正しかったみたいです。

やっぱり最適解を求めるのは大変なんで、オプティマイザさんもある程度ヒューリスティックな方法を採用しているのでしょうか。

 

 

こんなところでしょうか。初心者用とか書いたんですけど、もしかしたら中級者用かもしれませんね。ホントはvarchar比較のときは''つけないとだめだよ!とか書きたかったんですけどね。

 

さて、今日はこのくらいで。

久しぶりにまじめな事を書いたらちょっと疲れました。

 

今週はテストケースについてもなんとなくまとめておこうとおもいます。

最近意識高くて面白いです。