Mysql

【ZendFramework】インサートしたIDを取得

  • POST
最後にインサートしたレコードのIDを取得する方法 オートインクリメントで振られたIDを知りたい時の話 普通の方法 大抵のRMDBはオートインクリメントで振られたIDを覚えているので、 再度クエリを発行すればID値を取り出すことができる。 複数のユーザが同時にアクセスして登録したら? 軽く試してみたが問題ない。 コネクションを張る度に別プロセスと認識される 同一コネクション内でインサートしたオートインクリメント値が還ると思われる MySQL SELECT last_insert_id() SQLite SELECT last_insert_rowid() PHPによるアダプターを利用する場合 PDO PDO::lastInsertIdを使う。 上記のように、オートインクリメントによって振られたIDを取り出すSQL文はDB毎で異なる為、 PHPのソースコードとDB操作を分けるには不向きで、その差異を吸収する為に存在するメソッドと思われる。 要するにPDOを使う場合は何も考えずにPDO::lastInsertIdでおk // DBへ接続し、INSERT文を発行 $db = new PDO($dsn); $sql = 'INSERT INTO .....'; $db->exec($sql); // オートインクリメント値を取り出す $id = $db->lastInsertId(); Zend Framework アダプタークラスにlastInsertIdというメソッドが用意されている。 アダプターにPDOを使用した場合、lastInsertIdを呼んでるらしい。 $table = new Zend_Db_Table(); // Insert文発行 $adapter = $table->getAdapter(); $id = $adapter->lastInsertId(); $id = $table->getAdapter()->lastInsertId(); // 一発でやってもOK Zend_Db_Tableオブジェクトにアクセス出来ればlastInsertId()メソッド叩くだけで出てくる。 自社開発のコレクターとかモデルとか使ってる場合でも、 以下のようにZend_Db_Tableオブジェクトを返すメソッドを作成すれば良い。

【MySQL】インデックスとは

  • POST
目的 MySQLのインデックスに関して理解する。 - インデックスとはなんぞや? - 使い方の学習 - 実際に使ってみる&既存システムを覗いてみる インデックスとはなんぞや? 検索が早くなる位しか知らないので、 何故通常の検索では遅いのか、何故インデックスを使用するのか。 その辺から勉強していきたい(今更) MySQLパフォーマンスチューニングのためのインデックスの基礎知識 http://d.hatena.ne.jp/kiyo560808/20101117/1289952549 レコードの数が増えるにつれ、 特定のレコードを見つけ出すのに必要な処理が増える。 これをO(n)問題という。 メリット 検索する時にインデックスのみを見て式を評価 高速化が期待出来る -デメリット 所持するデータを複数持つので容量が肥大化 書き込み(SELECT以外)のパフォーマンスが低下 速度に関して じゃあ実際の速度ってどうなの? あんまり速くならないならデータを冗長化させる必要なんてないしね ソーシャルゲーム開発者なら知っておきたい MySQL INDEX + EXPLAIN入門 http://www.infiniteloop.co.jp/blog/2011/03/mysql-index-explain/ MySQL INDEX+EXPLAIN入門 のスライド5枚目 インデックスを使用すると、 SELECTに掛かる時間がレコードに比例せず一定 ( Д ) ゚ ゚ ただ、この最小単位が100万レコードってのが一つのキーになりそうだ。 1万程度までならインデックスを作成しない選択肢もあり得るのかもしれない。 でも、別にインデックス作ったからと言ってSelectが遅くなる訳じゃないので、 理由が無ければとりあえず作る位の考えでも良いのか? 使い方の学習 上記サイトに書いてあった方法 ALTER TABLE foo ADD INDEX (id, name) 効果的な使い方のキモは上記2サイトを参考 - インデックスの作成時 - 選択性の高い項目をインデックスにする - 複合インデックスは先頭から順に部分インデックスとしても使用できる - インデックスサイズを増やさない・増えることによる影響