Beste Medetweakers,
Ik ben nu al een tijdje bezig met een dynamische view in PHP.
Nu heb ik er al wel een draaien maar dit wordt traag zodra er wat meer records in de DB komen.
Om een kleine testcase op te zetten heb ik 3 tabellen aangemaakt n.l.
partner_group
partner
partner_address
Vervolgens heb ik er met dit scrippie +/- 25.000 records aangemaakt
En dan nu mijn echte vraag.
Ik wil vanuit een SQL query dynamisch een view opbouwen, met een pagina limiet van 30 records (instelbaar)
Als je dit bekijkt in stappen lijkt het me ook niet zo moeilijk n.l:
Vervang in query alles tussen SELECT en FROM met COUNT(*)
Tel aantal records van query zonder limit
Voeg limit statement toe aan query
Voer query uit en print records...hmm ok
In het bovenstaande verhaal wordt dus een query 2x uitgevoerd... niet heel wenselijk maar in mysql 3.x heb je niet veel andere mogelijkheden denk ik.<br />
Vanaf 4.1 wordt het dacht ik beter...namelijk je krijgt de SQL statement "SQL_CALC_FOUND_ROWS"
Nu heb ik hiermee getest en tot mijn grote verbazing lijkt het alsof 2 queries alsnog sneller is...
Ik heb 2 voorbeeld script bijgedaan dus bij de ene 2 queries waarvan 1 een count..en in het tweede script de SQL functie CALC_FOUND_ROWS
Please help...ben ik nu op de goede weg of moet ik het helemaal anders aanpakken
MET SQL COUNT(*)
MET SQL_CALC_FOUND_ROWS
Ik ben nu al een tijdje bezig met een dynamische view in PHP.
Nu heb ik er al wel een draaien maar dit wordt traag zodra er wat meer records in de DB komen.
Om een kleine testcase op te zetten heb ik 3 tabellen aangemaakt n.l.
partner_group
partner
partner_address
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| CREATE TABLE `partner_group` ( `partnergroupID` VARCHAR( 32 ) NOT NULL , `partnergroup` VARCHAR( 255 ) NOT NULL , PRIMARY KEY ( `partnergroupID` ) ); CREATE TABLE `partner` ( `partnerID` VARCHAR( 32 ) NOT NULL , `partner_nr` VARCHAR( 50 ) NOT NULL , `partnertype` ENUM( 'ORG', 'PER' ) NOT NULL DEFAULT 'ORG', `partnergroupID` VARCHAR( 32 ) NOT NULL , `partner_name` VARCHAR( 255 ) NOT NULL , PRIMARY KEY ( `partnerID` ) , INDEX ( `partnergroupID` ) ); CREATE TABLE `partner_address` ( `addressID` VARCHAR( 32 ) NOT NULL , `partnerID` VARCHAR( 32 ) NOT NULL , `address` VARCHAR( 255 ) NOT NULL , `zipcode` CHAR( 6 ) NOT NULL , `city` VARCHAR( 255 ) NOT NULL , PRIMARY KEY ( `addressID` ) , INDEX ( `partnerID` ) ); |
Vervolgens heb ik er met dit scrippie +/- 25.000 records aangemaakt
PHP:
1
2
3
4
5
6
7
8
9
10
| //Insert 25.000 records $partner_nr = -; for($i=0; $i<25000; $i++) { $partnerID = md5(microtime().microtime()); $addressID = md5(microtime().microtime()); $partner_nr++; mysql_query("INSERT INTO partner (partnerID,partner_nr,partnergroupID,partner_name) VALUES('".$partnerID."','".$partner_nr."','1','Test Company ".$i."') "); mysql_query("INSERT INTO partner_address (addressID,partnerID,address,zipcode,city) VALUES ('".$addressID."','".$partnerID."','parklaan 32','5623KJ','Eindhoven') "); } //End for($i=0; $i<10000; $i++) |
En dan nu mijn echte vraag.
Ik wil vanuit een SQL query dynamisch een view opbouwen, met een pagina limiet van 30 records (instelbaar)
Als je dit bekijkt in stappen lijkt het me ook niet zo moeilijk n.l:
Vervang in query alles tussen SELECT en FROM met COUNT(*)
Tel aantal records van query zonder limit
Voeg limit statement toe aan query
Voer query uit en print records...hmm ok
In het bovenstaande verhaal wordt dus een query 2x uitgevoerd... niet heel wenselijk maar in mysql 3.x heb je niet veel andere mogelijkheden denk ik.<br />
Vanaf 4.1 wordt het dacht ik beter...namelijk je krijgt de SQL statement "SQL_CALC_FOUND_ROWS"
Nu heb ik hiermee getest en tot mijn grote verbazing lijkt het alsof 2 queries alsnog sneller is...
Ik heb 2 voorbeeld script bijgedaan dus bij de ene 2 queries waarvan 1 een count..en in het tweede script de SQL functie CALC_FOUND_ROWS
Please help...ben ik nu op de goede weg of moet ik het helemaal anders aanpakken
MET SQL COUNT(*)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
| //connect mysql_connect("localhost","root","******"); mysql_select_db("test"); //Get Microtime function getmicrotime() { //list usec list($usec, $sec) = explode(" ",microtime()); //return return ((float)$usec + (float)$sec); } //End function getmicrotime() $BenchStart = getmicrotime(); $sql = " SELECT a.partnerID, b.partnergroup, c.address, c.zipcode, c.city FROM partner as a LEFT OUTER JOIN partner_group as b ON a.partnergroupID = b.partnergroupID LEFT OUTER JOIN partner_address as c ON a.partnerID = c.partnerID "; $sql_count = " SELECT COUNT(a.partnerID) as RowCount FROM partner as a LEFT OUTER JOIN partner_group as b ON a.partnergroupID = b.partnergroupID LEFT OUTER JOIN partner_address as c ON a.partnerID = c.partnerID "; //var $RowMax = 30; $RowLimit = 0; $RowCount = 0; //Map external values if( isset($_GET['RowLimit']) && is_numeric($_GET['RowLimit']) ) { $RowLimit = $_GET['RowLimit']; } //End if( isset($_GET['RowLimit']) && is_numeric($_GET['RowLimit']) ) //Calculate rows without max $CountData = mysql_fetch_object(mysql_query($sql_count)); //Test CountData if(!empty($CountData->RowCount)) { //map ViewCount $RowCount = $CountData->RowCount; } //End if(!empty($CountData->rows)) //Calculate pages $Pages = ceil($RowCount/$RowMax); //Build Limited Query $sql_limited = $sql." LIMIT ".$RowLimit.",".$RowMax; //Exec Limited Query $result = mysql_query($sql_limited); //Get ColumnsCount $ColumnCount = mysql_num_fields($result); //Print SelectBox For Pages echo "<select onchange=\"window.location='".$_SERVER['PHP_SELF']."?RowLimit='+this.value;\">\n"; for($i=0; $i<$Pages; $i++) { $selected = ""; if(($i*$RowMax)==$RowLimit) { $selected = " selected "; } echo "<option value=\"".($i*$RowMax)."\" ".$selected.">".($i+1)."</option>\n"; } //End for($i=0; $i<$pages; $i++) echo "</select>\n"; //Start Table echo "<table border=\"1\">\n"; //Column headers echo "<tr>\n"; for($i=0; $i<$ColumnCount; $i++) { echo "<th>".mysql_field_name($result,$i)."</th>\n"; } //End for($i=0; $i<$ColumnCount; $i++) echo "</tr>\n"; //loop records while($data = mysql_fetch_object($result)) { echo "<tr>\n"; //Loop cols foreach($data as $col) { echo "<td>\n"; echo $col; echo "</td>\n"; } //End foreach($data as $col) echo "</tr>\n"; } //End while($data = mysql_fetch_object($result)) //End table echo "</table>\n"; $BenchEnd = getmicrotime(); $BenchTime = round($BenchEnd-$BenchStart,5); echo $BenchTime; |
MET SQL_CALC_FOUND_ROWS
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
| //connect mysql_connect("localhost","root","******"); mysql_select_db("test"); //Get Microtime function getmicrotime() { //list usec list($usec, $sec) = explode(" ",microtime()); //return return ((float)$usec + (float)$sec); } //End function getmicrotime() $BenchStart = getmicrotime(); $sql = " SELECT SQL_CALC_FOUND_ROWS a.partnerID, b.partnergroup, c.address, c.zipcode, c.city FROM partner as a LEFT OUTER JOIN partner_group as b ON a.partnergroupID = b.partnergroupID LEFT OUTER JOIN partner_address as c ON a.partnerID = c.partnerID "; //var $RowMax = 30; $RowLimit = 0; $RowCount = 0; //Map external values if( isset($_GET['RowLimit']) && is_numeric($_GET['RowLimit']) ) { $RowLimit = $_GET['RowLimit']; } //End if( isset($_GET['RowLimit']) && is_numeric($_GET['RowLimit']) ) //Build Limited Query $sql_limited = $sql." LIMIT ".$RowLimit.",".$RowMax; //Exec Limited Query $result = mysql_query($sql_limited); //Calculate rows without max $CountData = mysql_fetch_object(mysql_query("SELECT FOUND_ROWS() as RowCount")); //Test CountData if(!empty($CountData->RowCount)) { //map ViewCount $RowCount = $CountData->RowCount; } //End if(!empty($CountData->rows)) //Calculate pages $Pages = ceil($RowCount/$RowMax); //Get ColumnsCount $ColumnCount = mysql_num_fields($result); //Print SelectBox For Pages echo "<select onchange=\"window.location='".$_SERVER['PHP_SELF']."?RowLimit='+this.value;\">\n"; for($i=0; $i<$Pages; $i++) { $selected = ""; if(($i*$RowMax)==$RowLimit) { $selected = " selected "; } echo "<option value=\"".($i*$RowMax)."\" ".$selected.">".($i+1)."</option>\n"; } //End for($i=0; $i<$pages; $i++) echo "</select>\n"; //Start Table echo "<table border=\"1\">\n"; //Column headers echo "<tr>\n"; for($i=0; $i<$ColumnCount; $i++) { echo "<th>".mysql_field_name($result,$i)."</th>\n"; } //End for($i=0; $i<$ColumnCount; $i++) echo "</tr>\n"; //loop records while($data = mysql_fetch_object($result)) { echo "<tr>\n"; //Loop cols foreach($data as $col) { echo "<td>\n"; echo $col; echo "</td>\n"; } //End foreach($data as $col) echo "</tr>\n"; } //End while($data = mysql_fetch_object($result)) //End table echo "</table>\n"; $BenchEnd = getmicrotime(); $BenchTime = round($BenchEnd-$BenchStart,5); echo $BenchTime; |
[ Voor 0% gewijzigd door vorlox op 05-08-2006 23:16 . Reden: Typos ]