Article View: pl.comp.lang.php
Article #219835Re: Wolno dzialajacy skrypt
From: Lemat
Date: Thu, 23 Jul 2009 20:55
Date: Thu, 23 Jul 2009 20:55
137 lines
5822 bytes
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-mailReferences:
<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