Bagaimana Mengatasi Query Agar Lebih Cepat ??

Para master2 semua…Mohon bantuannya

Ane Punya beberapa Query ke 1 tabel… kemudian Ane buat Methode sebagai berikut




public function getWilayah($key)

	{

		$kel_cd = $key;

		$kec_cd = substr($kel_cd,0,7)."000";

		$kab_cd = substr($kel_cd,0,4)."000000";

		$prop_cd = substr($kel_cd,0,2)."00000000";

		

		$kel_nm = Regional::model()->findAll(array(

						'condition'=>'regional_cd=:key',

						'params'=>array(

							':key'=>$kel_cd,

						),

					));

		$kec_nm = Regional::model()->findAll(array(

						'condition'=>'regional_cd=:key',

						'params'=>array(

							':key'=>$kec_cd,

						),

					));

		$kab_nm = Regional::model()->findAll(array(

						'condition'=>'regional_cd=:key',

						'params'=>array(

							':key'=>$kab_cd,

						),

					));

		$prop_nm = Regional::model()->findAll(array(

						'condition'=>'regional_cd=:key',

						'params'=>array(

							':key'=>$prop_cd,

						),

					));

		$wilayah='';

		

		foreach($kel_nm as $kel)

        {

			

			if($kel->getAttribute('pro_cd') > 0){

				foreach($prop_nm as $prop)

				{

					$wilayah .= $prop->getAttribute('regional_nm').' /';

				}

			}

			

			if($kel->getAttribute('kab_cd') > 0){

				foreach($kab_nm as $kab)

				{

					$wilayah .=$kab->getAttribute('regional_nm').' /';

				}

			}

		

			if($kel->getAttribute('kec_cd') > 0){

				foreach($kec_nm as $kec)

				{

					$wilayah .=$kec->getAttribute('regional_nm').' /';

				}

			}

			

			if($kel->getAttribute('kel_cd') > 0){

				foreach($kel_nm as $kel)

				{

					$wilayah .=$kel->getAttribute('regional_nm');

				}

			}

			$wilayah."<br>";

			

        }

		

		return $wilayah;

	}



Apabila Ane panggil Action itu hasilnya lama banget…




public function actionSuggestRegional()

	{

			if(Yii::app()->request->isAjaxRequest && isset($_GET['q']))

       {

            /* q is the default GET variable name that is used by

            / the autocomplete widget to pass in user input

            */

          $name = $_GET['q']; 

                    // this was set with the "max" attribute of the CAutoComplete widget

          $limit = 50; //min($_GET['limit'], 50); 

          $criteria = new CDbCriteria;

          $criteria->condition = "regional_nm LIKE :sterm";

          $criteria->params = array(":sterm"=>"%$name%");

          $criteria->limit = $limit;

          $userArray = Regional::model()->findAll($criteria);

          $returnVal = '';

          foreach($userArray as $userAccount)

          {

            // get wilyah ngambil nialai wilayah di method diatas..

			$returnVal .= $this->getWilayah($userAccount->getAttribute('regional_cd')).'|'.$userAccount->getAttribute('regional_cd')."\n";

          }

          echo $returnVal;

       }

	}



Nah Struktur dari tabel ada di gambar terlampir… Mohon dari Para Master masukannya… sebaiknya gimana Ane hrus buat kode agar lebih cepat Aksesnya… kemudian cara manggilnya bagaimana…

Terimakasih banyak sebalumnya…

Tambahan lagi… Di View Ane Manggilnya seperti ini…




<div class="row">

		<?php echo $form->labelEx($model,'regional_nm'); ?>

		<?php $this->widget('CAutoComplete',

				  array(

								 //name of the html field that will be generated

					 'name'=>'regional_name', 

								 //replace controller/action with real ids

					 'url'=>array('suggestRegional'), 

					 'max'=>10, //specifies the max number of items to display

		 

								 //specifies the number of chars that must be entered 

								 //before autocomplete initiates a lookup

					 'minChars'=>1, 

					 'delay'=>500, //number of milliseconds before lookup occurs

					 'matchCase'=>false, //match case when performing a lookup?

		 

								 //any additional html attributes that go inside of 

								 //the input field can be defined here

					 'htmlOptions'=>array('size'=>'40'), 

		 

					 'methodChain'=>".result(function(event,item){\$(\"#regional_nm\").val(item[1]);})",

					 ));

			?>

		<?php echo CHtml::hiddenField('regional_nm'); ?>

		<?php echo $form->error($model,'regional_nm'); ?>

	</div>



gan menurut ane, pemanggilan agan sudah standar Yii banget, Lamanya pemanggilan mungkin karena strukturnya memang sudah kurang enak untuk dipanggil…

dan memang Yii tidak menambah kecepatan akses justru memperlambat,

kalo mau cepat sedikit agak non-yii,

misal dengan memanggil beramaan shingga mengurangi fetching DB-nya, kemudian di ‘petani’ pake coding.

tips lain dengan mengindexk kolom-kolom di desain DB-nya yang menjadi key pencarian…

Adakah Solusi Lain???

Gimana ya Solusinya Gan… Agar lebih Cepat… Metode Querynya pake apa…!

query langsung pake DAO




Yii::app()->db->createCommand("select bla bla");



pake CActiveRecord lebih lamban

OO begitu too… Terimakasih atas masukannya…!

Itu server databasenya localhost tidak?

coba di config/main.php nya di setting ‘schemaCachingDuration’ diatas 0, misal 3600… soalnya ActiveRecord lama nya karena selalu menfetch meta data… dengan mensetting cache nya, fetch meta data dilakukan pada periode tertentu saja… semakin besar nilai cachedurationnya semakin baik, dengan syarat perubahan skema database (alter) tidak banyak berubah.

lihat docs :D

Databasenya localhost gan…

wah terimasih masukannya…

field regional_cd itu sudah di index gan?

regional_cd belum Ane Index gan…!

terimakasih atas pencerahaannya…!