sidewalkcafe blog

日々是好日

POTI-boardのDB化2

SQLiteからデータを呼び出す場合
1.まとめて呼び出して処理しながら配列に入れる
2.その都度必要なデータを呼び出して処理する


どっちの方が早いのかなと
まあ、大量データを扱うなら、PHPで配列操作するよりsqlで個々に呼び出した方が早い気がする


という事で
呼び出し1

<?php
try {
	//db接続
	$db = new PDO('sqlite:log/boardlog.db' );
	
	//ページ数
	$p=0;
	//1ページの記事数
	$page_def = 20;
	//現在ページの記事範囲
	$page_r = $p * $page_def ;
	//ページおわり
	$page_e = $page_r + $page_def ;
	
	//計測開始
	$start = microtime(true);
	//100回繰り返す
	for($i = 0; $i < 100; $i++) {
	//dql呼び出し文
	$sql = "select * from oekakibbs where invz == 0 order by parent asc, tree desc, id asc";
	
	//メインデータ変数
	$dat = array();
	//データ分割
	foreach ($db->query($sql) as $data) {
		//親データ取得
		$parent = $data['parent'];
		//ページおわり
		if($parent > $page_e){ break;}
		//現在ページ迄処理を飛ばす
		if ($parent == 0 ){ $comm_res[] = $data ; continue; }
		if ($parent <= $page_r ){continue ;}
		//親データ格納
		$dat['oya'][] = $data ;
		
		//親記事番号
		$oya = $parent -1;
		//子データ格納
		foreach ($comm_res as $res) {
			if($res['tree'] != $data['tree']){continue;}
			$dat['oya'][$oya][] = $res ; 
		}
	}
	}
	
	$end = microtime(true);
echo "処理時間:" . ($end - $start) . "秒";

	//db切断
    $db = null;
  } catch (PDOException $e) {
    echo "<p>エラー:", $e->getMessage(), "</p>";
}

約5.3病でした


その2

<?php

try {
	//db接続
	$db = new PDO('sqlite:log/boardlog.db' );
	
	
	//ページ数
	$p=0;
	//1ページの記事数
	$page_def = 20;
	//現在ページの記事範囲
	$page_r = $p * $page_def ;
	//ページおわり
	$page_e = $page_r + $page_def ;
	
	
	//計測開始
	$start = microtime(true);
	
	for($i = 0; $i < 100; $i++) {
	//dql呼び出し文
	$sql = "select * from oekakibbs where invz == 0 and parent > 0 order by parent asc";
	
	//メインデータ変数
	$dat = array();
	//データ分割
	foreach ($db->query($sql) as $data) {
	
		//親データ取得
		$parent = $data['parent'];
		//ページおわり
		if($parent > $page_e){ break;}
		//現在ページ迄処理を飛ばす
		if ($parent <= $page_r ){continue ;}
		
		$dat['oya'][] = $data ;
		
		//親記事
		$oya = $parent -1;
		
		$tree_res = $data['tree']; 
		
		$sql2 = "select * from oekakibbs where invz == 0 and tree == $tree_res order by id desc";
		
		foreach ($db->query($sql2) as $res) {
			$dat['oya'][$oya][] = $res ; 
		}
	}
	}
	$end = microtime(true);
echo "処理時間:" . ($end - $start) . "秒";

	//db切断
    $db = null;
  } catch (PDOException $e) {
    echo "<p>エラー:", $e->getMessage(), "</p>";
}

約0.4秒!!


全然違うね〜
やっぱり毎度sqlで呼び出した方が早い


よく考えたらwhere で parent > 開始NO and parent <=終了no とした方が早いか