_onichannn

【MySQL】SELECT文をチューニングするための情報を取得する。

めも。

SQLを発行する再、文の一番先頭に「EXPLAIN」とつけると、オプティマイザのデバッグ情報を取得することが出来る。

下記例。

EXPLAIN SELECT * FROM table_name WHERE id = 1

上記SQLによって取得出来る情報の「type」の欄が重要。

「type」には下記表のものが多く見られる。

system テーブルに1レコードしかない状態
const マッチするレコードが1件しかない状態。PRIMARY KEYまたはUNIQUEインデックスを利用して検索される
eq_ref JOINにおいてPRIMARY KEYまたはUNIQUEインデックスを利用して1つのレコードを検索している状態。理想的なJOINの形式
range インデックスを用いた範囲検索
index すべてのレコードのインデックスをスキャンする必要がある状態(フルインデックススキャン)
ALL すべてのレコードを走査する必要がある状態(フルテーブルスキャン)

上から順に高速なので、なるべく上に近づくようなSQLを発行してやれば結果的にパフォーマンスは上昇する。

 

【Linux】Vimでカーソルを最終行、先頭行に移動させる方法。

メモ。

■最終行に移動する

Shift + g

■先頭行に移動する

gg [g2回]

■指定した行に移動する

:[行数] → Enter

 

【CakePHP2.4】発行されているSQLをコンソールから確認する方法。

CakePHPにてSQLを確認する方法は、ブラウザ上からデバッグキットを用いるか、sql_dumpの欄を見る方法がある。

ではコンソールから見たい場合はどのように取得すればいいのか?

ということで調べてみた。

■モデルから

$log = $this->getDataSource()->getLog();
var_dump($log);

■コントローラーから

$log = $this->Model->getDataSource()->getLog();
var_dump($log);

というように、getDataSouce()メソッドを用いることでSQLを取得することが出来た。

 

【PHP】SJISからUTF8に文字コード変換する際の文字化けを防ぐ。

Excelで生成したCSVファイルをPHPで取り込む際、下記のようにSJISからUTF8の文字コード変換を行うが、その際「チルダ」や「全角ハイフン」が正しく認識されない事がある。

$str = mb_convert_encoding($str, mb_internal_encoding(), 'SJIS');

そのため、mb_convert_encoding()第3引数のfrom_encodingを下記のように指定してやる必要がある。

$str = mb_convert_encoding($str, mb_internal_encoding(), 'SJIS-WIN');

上記の通り文字コードを指定した結果、文字化けは綺麗に解消された。

nbsp;

【MySQL】データベースを指定してdumpファイルを生成する。

メモ。

mysqldump -u [ユーザー名] -p [データベース名] > [出力ファイルパス]

下記例。

mysqldump -u root -p hoge > /path/to/output.sql

 

【MySQL】重複しているレコードを最古のものを残しすべて削除するSQL。

調べていたら神SQLを見つけたのでメモ。

サブクエリを用いる。

delete from `[table_name]` where id not in (select min_id from (select min(t1.id) as min_id from `[table_name]` as t1 group by t1.[duplicate_col]) as t2);

table_nameに対象のテーブル名を。
duplicate_colに重複レコードが確認できるカラム名を。

これで重複していた行は古いものを1件のみ残し、すべて削除される。

神すぎる。

 

【CakePHP2.4】find()で複数のOR条件をANDで結合したいときの書き方。

めも。

$conditions = array(
	$this->alias.'.col1' => 'value_1',
	$this->alias.'.col2' => 'value_2',
	
	'OR' => array(
		array($this->alias.'.col3 LIKE' => '%value_3%'),
		array($this->alias.'.col3 LIKE' => '%value_4%'),
	),
	'AND' => array(
		'OR' => array(
			array($this->alias.'.col4' => 'value5'),
			array($this->alias.'.col5' => 'value6')
		)
	)
);

 

【PHP】XMLの指定したノードの子ノードを見付ける。

めも。

例えばRSSファイルの下記のような要素にアクセスしたい場合。

<dc:date></dc:date>
<dc:subject></dc:subject>

SimpleXMLElement::children()メソッドを用いることで取得可能。

下記例。

foreach($xmlObj->item as $item) {
    $date = $item->children('dc', true)->date;
    $subject = $item->children('dc', true)->subject;
}

第2引数のtrueは第1引数をプレフィックスとして扱うか否かのフラグ。