🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.php
Article #219835

Re: Wolno dzialajacy skrypt

#219835
From: Lemat
Date: Thu, 23 Jul 2009 20:55
137 lines
5822 bytes
maYk wrote:

> Witajcie, pracuje nad systemem zarzadzania kontaktami w ktorym mamy 3
> najwazniejsze tabele:
> 
> - lista firm
> - lista kontaktow
> - lista statusow
> 
> No wiec, wyglada to tak. Mamy sobie tabelke o nazwie "lista kontaktow"
> ktorej struktura wyglada mniej wiecej tak:
> 
> ID, company name, first name, last name, address, city, state, zip,
> phone, product_status, status
> 
> Pole "company name" odpowiada numerem nazwie firmy w tabelce "lista
> firm" a pole product_status to lancuch cyfr odzielonych przecinkiem
> ktore odpowiadaja statusom w tabelce "lista statusow".
> 
> Kiedy wchodzimy na strone, skrypt zaczyna zliczac wszystkie rekordy z
> tabelki "lista kontaktow" i wrzuca wszysko w multidimensional array
> $company[], $last_name[], $statuses[].
> 
> $sql = "SELECT * FROM `_cms_groups_data WHERE `status` = '3'";
> $result  = mysql_query($sql, $dbh1) or die ("Could not get
> results2.". mysql_error());
> while ($wynik = mysql_fetch_array($result)) {
> $companies[$inc]['ID'] 				= $wynik['company'];
> $companies[$inc]['GROUP'] 			= $_SESSION['group'];
> $companies[$inc]['company_name']  	= pull_up_company_name
> ($_SESSION['group'], $wynik['company']);
> $inc++;
> $last_name[] = $wynik['last_name'];
> $statuses[]  = $wynik['product_status'];
>                   }
> 
> Nastepnie, usuwamy wszystkie powielone rekordy w kazdej z tablic:
> 
> if (isset($companies)){
> $companies = arrayUnique($companies);
> foreach($companies as $key => $value) {
> if($value == "") {
> unset($companies[$key]);
> }
> }
> $companies = array_values($companies);
> $companies = array_msort($companies, array('company_name'=>array
> (SORT_ASC,SORT_REGULAR)));
> 
> }
> if (isset($last_name)){
> $last_name = array_unique($last_name);
> //REMOVE EMPTY RECORDS
> foreach($last_name as $key => $value) {
> if($value == "") {
> unset($last_name[$key]);
> }
> }
> $last_name = array_unique($last_name);
> $last_name  = array_values($last_name);
> sort($last_name,SORT_STRING);
> //$last_name = array_msort($last_name, array('last_name'=>array
> (SORT_ASC,SORT_REGULAR)));
> }
> 
> if (isset($statuses)){
> $new_statuses = array();
> for ($a=0;$a<count($statuses);$a++){
> $new_statuses =	array_merge(explode(",",$statuses[$a]),
> $new_statuses);
> }
> $new_statuses = array_values(array_unique($new_statuses));
> for ($a=0;$a<count($new_statuses);$a++){
> if ($new_statuses[$a] != ""){
> $list_statuses[$a]['ID'] 			= $new_statuses[$a];
> $list_statuses[$a]['status_name'] 	= $pull_up_product_status_info
> [$new_statuses[$a]];
> }else {
> unset($new_statuses[$a]);
> }
> }
> if (isset($list_statuses))	{
> $list_statuses  = array_values($list_statuses);
> $list_statuses = array_msort($list_statuses, array
> ('status_name'=>array(SORT_ASC,SORT_REGULAR)));
> }
> }
> 
> 
> A nastepnie tworzymy z kazdej ze zmiennych pola wyboru HTML:
>  <select name=company>unikalna i posortowana lista firm</select>
> <select name=last_name>unikalna i posortowana lista nazwisk</select>
> <select name=status>unikalna i posortowana lista statusow</select>
> 
> 
> Problem polega na tym ze wszystko to bardzo wolno dziala. Przy 1700
> rekordow skrypt pojawia sie okolo 17 sekund. Zauwazylem ze kiedy usune
> zawartosc kolumny product_status ktora najczesciej wyglada tak:
> 4,14,23,1,3,26 to czas wykonywania tego samego skryptu spada do 4
> sekund. Bardzo prosze o porade, jak moge uczynic moj skrypt szybszym,
> oraz jakich bledow unikac aby nie spotykac sie z takimi problemami w
> przyszlosci.

dobra wróżka mi podpowiada, że pomyślałeś sobie, że pokazanie reszty skryptu 
będzie nieistotne.

następnie dobra wróżka mi powiedziała, że funkcja pull_up_company_name() 
robi coś bardzo brzydkiego i długiego jak na przykład kolejne zapytanie do 
bazy danych...

stąd też doradzam przewalenie większości pracy na bazę danych, zakładam, że 
masz tam tabelę lista_firm zawierającą co najmniej 2 pola: id,name
Wybierzmy więc tylko unikalne rekordy i w dodatku każemy bazie danych je od 
razu posortować:

$sql = "SELECT company.company, lista_firm.name LEFT JOIN lista_firm ON 
company.company=lista_firm.id FROM `_cms_groups_data WHERE `status` = '3' 
GROUP BY company.company ORDER BY lista_firm.name";
while ($wynik = mysql_fetch_array($result)) {
	$companies[$inc]['ID']            = $wynik['company'];
	$companies[$inc]['GROUP']         = $_SESSION['group'];
	$companies[$inc]['company_name']  = $wynik['name'];
	$inc++;
	}

podobnie zróbmy sobie last_name:

$sql = "SELECT DISTINCT last_name FROM `_cms_groups_data WHERE `status` = 
'3' ORDER BY last_name";
while ($wynik = mysql_fetch_array($result)) {
	$last_name[] = $wynik['last_name'];
	}

no a statusy to oddzielna bajka...
-- 
Pozdrawiam
Lemat
Technical Details
Message-ID: <h4aj9q$gui$1@nemesis.news.neostrada.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!nf1.ipartners.pl!ipartners.pl!news.nask.pl!news.nask.org.pl!newsfeed00.sul.t-online.de!newsfeed01.sul.t-online.de!t-online.de!newsfeed.neostrada.pl!atlantis.news.neostrada.pl!news.neostrada.pl!not-for-mail
References: <73ced6b9-b6ea-42c8-beb7-d3af06008365@26g2000yqk.googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!nf1.ipartners.pl!ipartners.pl!news.nask.pl!news.nask.org.pl!newsfeed00.sul.t-online.de!newsfeed01.sul.t-online.de!t-online.de!newsfeed.neostrada.pl!atlantis.news.neostrada.pl!news.neostrada.pl!not-for-mail
From: Lemat <#@lemat.priv.pl>
Newsgroups: pl.comp.lang.php
Subject: Re: Wolno dzialajacy skrypt
Followup-To: pl.comp.lang.php
Date: Thu, 23 Jul 2009 22:55:21 +0200
Organization: lemat.priv.pl
Lines: 139
Message-ID: <h4aj9q$gui$1@nemesis.news.neostrada.pl>
References: <73ced6b9-b6ea-42c8-beb7-d3af06008365@26g2000yqk.googlegroups.com>
NNTP-Posting-Host: goblin.lemat.priv.pl
Mime-Version: 1.0
X-Trace: nemesis.news.neostrada.pl 1248383098 17362 79.190.106.118 (23 Jul 2009 21:04:58 GMT)
X-Complaints-To: usenet@news.neostrada.pl
NNTP-Posting-Date: Thu, 23 Jul 2009 21:04:58 +0000 (UTC)
User-Agent: KNode/0.99.01
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit