スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[チューニング]式インデックス(関数インデックス)を使う

例えばdate型(つまりYYYY-MM-DDのような日付)のカラムを持つテーブルがあるとする。ちゃんとインデックスも張ろう。
create table test_table (id int4, dt date)
create index dt_index on test_table (dt)
このテーブルから「水曜日のレコードだけを抽出したい」とする場合、
select * from test_table where date_part('dow', dt) = 4
(注:dowとは曜日のことでゼロが日曜で6が土曜)
などと書くが、このときdt_indexインデックスは使用されずにSeq Scan(つまりフル走査)が走ってしまう。つまり遅い。なぜなら、dt_indexはYYYY-MM-DDのような日付の値のインデックスだから。

そこで関数インデックスの登場。
create index dt_dow_index on test_table (date_part('dow',dt))
とすると、date_part()という関数によって得られた0-6の値に対してインデックスを張ることができるので、先ほどのSELECTであればdt_dow_indexインデックスを使った高速な Index Scanをしてくれる。


参考サイト

http://neta.ywcafe.net/000960.html
スポンサーサイト

explodeで改行で分割する時の注意点

exolodeは、ある文字列とかで分割して配列にする関数です。
それで、改行で分割した場合など

$str = "あいう\nえお";
$ary = explode('\n', $str);

のように、シングルクォートで改行コードを括ると分割出来ない。
改行コードを分割する場合は

$str = "あいう\nえお";
$ary = explode("\n", $str);

のようにダブルクォートで括ること。

strtotimeの落とし穴

31日ある月と30日しか無い月とか、2月とかの計算が思い通りにうまくいかない時の対処法。

ダメパターン

<?php
$timestamp = strtotime('2006-03-31 -1 month');
echo date('Y-m-t', $timestamp);
?>

結果:2006-03-31

OKパターン

<?php
$timestamp = strtotime('2006-03-31');
$now = date('Y-m-01',$timestamp);

$timestamp = strtotime($now.' -1 month');
echo date('Y-m-t', $timestamp);
?>

結果:2006-02-28

まぁ、「1ヶ月前」の解釈の仕方にもよりますが・・・。

auでファイル名にスペースがある時に画像が表示されない

docomoとか、PCではファイル名にスペースが入っていても、何の問題もなくファイルが表示出来ていたのに、auでは表示されていなかった。
URLエンコードをしていなかったのが原因だったけど、普通に

$img = "a b.jpg";
<img src="<?= urlencode($img) ?>" />

にすればOKかと思ってたけど、これでも表示されず・・・
色々調べると、urlencodeは半角スペースを"+"に変換していて、それだと表示されないらしい。
なので

$img = "a b.jpg";
<img src="<?= rawurlencode($img) ?>" />

のように、rawurlencodeを使うと半角スペースが"%20"に変換されて、見事表示されました。
表示出来てよかった~

プロフィール

U2K

Author:U2K
いろいろプログラムに関しての覚え書きをちょくちょくと書いていきます。

オススメ










オススメ

忍者AdMax

u2k on Twitter

最近の記事


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。