2024.01.17
STAFF BLOG
スタッフブログ
TECHNICAL
テクログ
どうも、お久しぶりです。
罠というほどでもないのですが、array_keysの考慮もれが原因でスロークエリが発生するケースが
あったのでそれを今回は書こうと思います。
それと似た問題で array_mergeの罠(これは罠といっていいんじゃないか)についても書こうと思います。
array_keysについて
$data['572946503859'] = [
'title' => 'タイトル',
'body' => '本文'
];
$data['avoajsunwosim'] = [
'title' => 'タイトル',
'body' => '本文'
];
$keys = array_keys($data);
var_dump($keys);
簡単なサンプルで説明します。上記のようなデータがあるとします。
「572946503859」「avoajsunwosim」はDBのレコードを識別するユニークなものと考えていただけますと。
また、これを保存しているカラムは INDEXの効いた VARCHAR で実装してるものとします。
この時、array_keysの結果が入った $keys は以下のようになります。
array(2) {
[0]=>
int(572946503859)
[1]=>
string(13) "avoajsunwosim"
}
ここで注意なのが「572946503859」の方がintで格納されるということです。
これをもとに以下のようなSQLを発火してしまうと(hoge_hogeというカラムはVARCHAR想定です)
hoge_hogeというカラムに実装しているINDEXが効かず、テーブルのフルスキャンが走ります。
SELECT *
FROM blog_details
WHERE hoge_hoge IN (572946503859, 'avoajsunwosim');
blog_detailsというテーブルに大量のデータが入っていると、RDSのCPU使用率が高騰する原因に繋がるので
気をつけたいという話でした。
array_mergeについて
$data1 = [
'111' => '',
'aaa' => '',
];
$data2 = [
'222' => '',
'bbb' => '',
];
$data = array_merge($data1, $data2);
var_dump($data);
上記のようなデータがあるとします。
2つの配列をarray_mergeした結果はどうなるでしょうか?
感覚的には「111」「aaa」「222」「bbb」の4つのキーを持った1次元配列を持つんじゃないか?と考えそうです。
ですが結果は以下です。
array(4) {
[0]=>
string(0) ""
["aaa"]=>
string(0) ""
[1]=>
string(0) ""
["bbb"]=>
string(0) ""
}
え、「111」「222」どこいったん … って感じですよね。
array_mergeは数値インデックスを0から再度振り直す仕様なので、
これを気をつけておかないと結構危険です。
ちなみに、array_mergeではなく、+ を使えば「111」などが消えることは無いです。
$data = $data1 + $data2;
以上となります。