最近MySQLに詳しい人と一緒に仕事をすることになり、結構色々と勉強になることを教えてもらったのでメモを残しておく。
プログラム全般に関して
プログラムのデザインパターンやソート関連のアルゴリズムは目を通しておく程度に勉強しておいた方がよい。
自分の中で概念のインデックスを作ることで、それを手がかりに実装方法を検索しプログラミングすることができる。
データベースソフトウェアに関して
データペースソフトに関してはOracleが最も優れているので、Oracleで実装されている機能を覚えておくとよい。(MySQLで実装されていなくとも、それに似たことをすることは出来る可能性がある。)
DB設計に関して
画面仕様書が出来る前にDB設計をすることはWeb系の案件ではほぼ皆無なので、画面からDB設計を行っていけるようにする。
設計の大まかな手順
1.画面上から保存しないといけない要素の洗い出し
2.正規化を行い、各テーブルに振り分ける
プログラミングに関して
プログラムを書く際には、DB側で出来る処理は全てDBに任せる。
DBでどうしても出来ないものに関してはWeb側で処理をする。
理由はユーザーの流入経路がWebからDBの順番であるから。
Web側にはユーザー数とイコールの関係で負荷が掛かるが、DBに関してはDBアクセスが必要なページ以外では負荷がかからないので、Web側の負担を軽くするために、なるべくDB側に寄せる方が懸命である。
データベースエンジンの選び方に関して
ログ系や認証系のものを保存するのであればMyISAMやKVSが向いている。
但し、1つのDBサーバにエンジンが異なるものを使用するのは現実的ではないため、大概のシステムでInnoDBが採用されている。
もし本当にDBを分ける必要があれば、エンジンごとに別のDBサーバを使用するのがよい。
MySQLのカラム数に関して
MySQLのカラム数が100を超えると格段にパフォーマンスが下がるので、その場合は正規化してやる必要がある。
そうすることで、インデックスの数も減るし、オプティマイザが迷うことが少なくなるので、高速化される。
とりあえず今日話した内容はざっくりこんな感じ。
page_adsence
2013年5月15日水曜日
2012年12月17日月曜日
MySQLのIN句のインデックスに関して
IN句はインデックスが使用されない。
なぜかというと、1レコードごとに全レコードの値を取ってきているから。
あと、インデックスの使うためには、本来あるフィールドに対して、関数を利用したものと比較する際には、インデックスは使用されない。
これはインデックスが使われる
本来は逆であるべきだが、
みたいなのはインデックスが使用できない。Oracleの場合はfunctionIndexが使えるので、それで対応できるらしい。
なぜかというと、1レコードごとに全レコードの値を取ってきているから。
あと、インデックスの使うためには、本来あるフィールドに対して、関数を利用したものと比較する際には、インデックスは使用されない。
これはインデックスが使われる
TO_CHAR(YYYY-MM-DD, 'YYYYMMDD') = 20121217
本来は逆であるべきだが、
YYYY-MM-DD = TO_DATE('YYYYMMDD')
みたいなのはインデックスが使用できない。Oracleの場合はfunctionIndexが使えるので、それで対応できるらしい。
2012年5月2日水曜日
2012年3月22日木曜日
word-breakに関して
普通、半角英数字に関してはブラウザで折り返ししてくれないのですが、
それを折り返すために以下のように書いたりするのですが、
IE独自の仕様のためFirefox等のブラウザでは別途対応が迫られてしまいます。
で、折り返しをするためにJavascriptを使うのが定石だと思っていたのですが、
CSSの記述だけでいけるってのを教えてもらって、それを何度か使っていたくせに
毎回書き方を聞かれて忘れているのでメモしておく。
若干情報が古いですが、よくまとまっているので参考。
http://blog.sakurachiro.com/2010/06/control-break/
それを折り返すために以下のように書いたりするのですが、
IE独自の仕様のためFirefox等のブラウザでは別途対応が迫られてしまいます。
.word_break {
word-break: break-all
}で、折り返しをするためにJavascriptを使うのが定石だと思っていたのですが、
CSSの記述だけでいけるってのを教えてもらって、それを何度か使っていたくせに
毎回書き方を聞かれて忘れているのでメモしておく。
.word_wrap {
word-wrap: break-word;
}若干情報が古いですが、よくまとまっているので参考。
http://blog.sakurachiro.com/2010/06/control-break/
2012年3月16日金曜日
mkdirは実は再帰的にディレクトリを作ることができたらしい
今まで知らなかったけど、実はmkdirはphp5から再帰的にディレクトリを作ることができるみたい。
なので早速やってみた。
使い方は以下の通り。
こうすると「/path/to/dir」へのディレクトリが一気に作成される。
ちなみに、「/path/to」までのディレクトリが存在していても、エラーになるわけではないみたいです。
もうphp4で開発する機会も大分減ってきたし、がんがん使っていこうと思います。
なので早速やってみた。
使い方は以下の通り。
mkdir(ディレクトリのパス, パーミッション, 再帰処理フラグ);
mkdir('/path/to/dir', 0775, true);こうすると「/path/to/dir」へのディレクトリが一気に作成される。
ちなみに、「/path/to」までのディレクトリが存在していても、エラーになるわけではないみたいです。
もうphp4で開発する機会も大分減ってきたし、がんがん使っていこうと思います。
2012年3月15日木曜日
Firefox11のページインスペクタが3Dで見ると面白い
先日、帰り際にFirefox11がリリースされているってのに気づいたので、早速アップデートしてみた。
とりあえず必須アドオンだけ動くのを確認してアップデート。
で、リリースノートを見てみたらすごいよくわからない機能があった。
ふむ、まぁ便利だね。
これも会社と自宅のアドオン同期できるようになるので、まぁ便利だ。
ん??
3D??
3Dにする必要あるのか?と思いながらも、早速使ってみました。
使ってみた感想としては・・・。
すごいっ!!
Webページ構造を立体的に見るとこういう風に見えるのかと。
なんかpositionとかマイナスにして画面外に吹っ飛ばしている要素まで、
ぐるぐる回していると見つかってしまいます。
試しにYAHOOとかGmailのページにアクセスして使ってみたのですが、面白いです。
非常に。
これから無駄に使っていこうと思います。
ちなみに使い方は以下の通り。
1.ブラウザ上で右クリックしてコンテキストメニューを表示させる
2.要素を調査
3.すると画面右下に3D、HTML、スタイルと3つのボタンが並んで出てくるので、3Dをクリック。
そうするとこうなります。
以上。
簡単ですね。
とりあえず必須アドオンだけ動くのを確認してアップデート。
で、リリースノートを見てみたらすごいよくわからない機能があった。
「Google Chrome から、ブックマーク、履歴、Cookie を
インポートできるようになりました。」ふむ、まぁ便利だね。
「Firefox Sync でアドオンを同期できるようになりました。」これも会社と自宅のアドオン同期できるようになるので、まぁ便利だ。
「ページインスペクタの 3D ビュー を使って、
Web ページの構造を立体的に視覚化できるようになりました。」ん??
3D??
3Dにする必要あるのか?と思いながらも、早速使ってみました。
使ってみた感想としては・・・。
すごいっ!!
Webページ構造を立体的に見るとこういう風に見えるのかと。
なんかpositionとかマイナスにして画面外に吹っ飛ばしている要素まで、
ぐるぐる回していると見つかってしまいます。
試しにYAHOOとかGmailのページにアクセスして使ってみたのですが、面白いです。
非常に。
これから無駄に使っていこうと思います。
ちなみに使い方は以下の通り。
1.ブラウザ上で右クリックしてコンテキストメニューを表示させる
2.要素を調査
3.すると画面右下に3D、HTML、スタイルと3つのボタンが並んで出てくるので、3Dをクリック。
そうするとこうなります。
以上。
簡単ですね。
2012年3月14日水曜日
JsonpでAjax通信時にネットワーク系のエラーが発生した際のエラーハンドリング
Twitterからタイムラインを取得してきて、表示するという単純な処理を書いていたのですが、
IP別に1時間のリクエスト数が150を超えると400 Bad Requestとなってしまうため、
callback関数が呼ばれずに処理が途中で終了してしまうという現象に遭遇した。
てっきりJSONPの場合もerrorとかの関数も呼ばれていると思っていたのですが、そうではない様子。
試しにerrorとか書いてみても全く反応なし・・・。
調べてみたらどうやらJSONPの場合はsuccessとcomplete以外はコールされないらしい。
とりあえずググってみたら、案の定出てきました。
「jquery.jsonp.js」
これを使えば普通にエラーハンドリングができそうです。
IP別に1時間のリクエスト数が150を超えると400 Bad Requestとなってしまうため、
callback関数が呼ばれずに処理が途中で終了してしまうという現象に遭遇した。
てっきりJSONPの場合もerrorとかの関数も呼ばれていると思っていたのですが、そうではない様子。
試しにerrorとか書いてみても全く反応なし・・・。
調べてみたらどうやらJSONPの場合はsuccessとcomplete以外はコールされないらしい。
とりあえずググってみたら、案の定出てきました。
「jquery.jsonp.js」
これを使えば普通にエラーハンドリングができそうです。
$.jsonp({
url: "http://hoge.jp/",
callback: "callback_function_name",
success: function(json) {
// This will be called in case of success no matter the callback name
},
error: function() {
// This will be called in case of error no matter the callback name
}
});
jqueryを使って配列をPOST
一番簡単な方法は対象のフォームを要素をセレクタで選択してシリアライズしてPOST。
あとはサーバサイドでよしなにすればOK。
Jquery
php
但し、通常のフォームでPOSTされてきたように送りたい場合はJS側で色々と手を入れないといけない。
ソースに関してはその部分が出来次第公開予定。
あとはサーバサイドでよしなにすればOK。
Jquery
var postData = $('form').serializeArray();
$.post(
'index.php',
postData,
function(data){
console.log(data);
}
);php
var_dump($_POST);但し、通常のフォームでPOSTされてきたように送りたい場合はJS側で色々と手を入れないといけない。
ソースに関してはその部分が出来次第公開予定。
2012年3月13日火曜日
mysqlに接続できない
会社で用意してもらったテスト用のサーバでローカル上のmysqlを使おうと思ったら
以下のようなエラーで出て接続ができなかった。
とりあえずググってみたら、mysqldが起動してない可能性があると。
で、psコマンドで調べてみた。
いない・・・。
じゃあmysqlを起動させようと思って、
へ移動しようと思ったらmysqldが存在してない!
mysqlコマンド自体は使えるから、インストールとかに失敗してるのかと思って、
何度かアンインストールしてから、再インストールしてみたりとかしたのですが、状況は変わらず・・・。
なぜかわからず、ググり続けてみたらありました。
mysql-serverがインストールされていないんじゃないかという・・・。
というか、よくよく見てみたら結構色々とインストールされていなかった・・・。
mysql-serverだけでなく、php-mysqlとかも入ってなかった。
勝手に使える状態だと思っていたのですが、確認は大事ですね。
以下のようなエラーで出て接続ができなかった。
$ mysql -uroot
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'とりあえずググってみたら、mysqldが起動してない可能性があると。
で、psコマンドで調べてみた。
$ ps aux | grep mysqldいない・・・。
じゃあmysqlを起動させようと思って、
$ /etc/init.d/mysqld startへ移動しようと思ったらmysqldが存在してない!
mysqlコマンド自体は使えるから、インストールとかに失敗してるのかと思って、
何度かアンインストールしてから、再インストールしてみたりとかしたのですが、状況は変わらず・・・。
なぜかわからず、ググり続けてみたらありました。
mysql-serverがインストールされていないんじゃないかという・・・。
というか、よくよく見てみたら結構色々とインストールされていなかった・・・。
mysql-serverだけでなく、php-mysqlとかも入ってなかった。
勝手に使える状態だと思っていたのですが、確認は大事ですね。
2012年2月29日水曜日
SimpleXMLElementを配列に変換(簡易版)
SimpleXMLを配列に変換するのがどうにもこうにも面倒くさいなーと思っていたのでググってみた。
$array = json_decode(json_encode($SimpleXMLElement), true);
この1行のソースで対応可能らしい。
但し属性等がある場合には使えないので、そういう属性がつかないことが保障されている場合には使える。
1行でいけるのは結構便利だなー。
$array = json_decode(json_encode($SimpleXMLElement), true);
この1行のソースで対応可能らしい。
但し属性等がある場合には使えないので、そういう属性がつかないことが保障されている場合には使える。
1行でいけるのは結構便利だなー。
登録:
投稿 (Atom)