Hallo allemaal,

Ik heb een script waarbij ik via jQuery een tabel aanmaak waarin ik heel snel een row kan opzoeken tussen 36.000+ andere rows.

Maar het duurt HEEEEL lang voordat het geladen is.

Weet iemand hoe ik dit kan verbeteren?


De query:
<?php

$sql = "
SELECT
ID,
client_id,
name,
contact
FROM
clients
ORDER BY
name, ID
";
?>

De tabel:
<?php
CREATE TABLE IF NOT EXISTS `clients` (
`ID` int(20) NOT NULL,
`client_id` int(20) NOT NULL,
`name` varchar(255) NOT NULL,
`street` varchar(255) NOT NULL,
`postal` varchar(255) NOT NULL,
`city` varchar(255) NOT NULL,
`country` varchar(255) NOT NULL,
`phone` varchar(255) NOT NULL,
`since` varchar(255) NOT NULL,
`changed` varchar(255) NOT NULL,
`contact` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=36085 DEFAULT CHARSET=latin1;
?>

Alvast bedankt!
Uhm, je ID is geen primary key / auto increment veld?

Verder zou je een index op name kunnen aanmaken zodat het sorteren sneller gaat.
ID is primary AUTO_INCR

client_id en name zijn indexes
Heb je vastgesteld dat de laadtijd echt zit in het uitvoeren van de query, of toch ergens anders? Als je heel veel data naar je scherm stuurt, dan kan dat op zichzelf ook al veel tijd kosten.
Je huidige query selecteert niet één row van de 36.000 maar hij selecteert ze alle 36.000. Vandaar misschen de traagheid ?

Wanneer je één row wilt selecteren voeg dan een WHERE clausule toe.
Hij moet juist die 36.000 rijen invoegen vanwege dat jQuery er een tabel van maakt waar je in kan zoeken.

Datatables.

<table id="table_archive" class="table table-striped table-bordered table-responsive" cellspacing="0" width="100%">
                                        <thead>
                                            <tr>
                                                <th>Client ID</th>
                                                <th>Bedrijfsnaam</th>
                                                <th>Contact persoon</th>
                                                <th>Actie</th>
                                            </tr>
                                        </thead>
                                 
                                        <tbody>
                                            <?php
											$sql = " 
											SELECT 
												ID,
												client_id,
												name,
												contact
											FROM
												clients  
											
											";
											
										    if(!$res = mysqli_query($mysqli, $sql)) 
											{ 
												trigger_error('Fout in query: '.mysqli_error()); 
											} 
											else 
											{ 
												while($row = mysqli_fetch_assoc($res)) 
												{ 							
													echo '<tr>';
														
														echo '<td>'.$row['client_id'].'</td>';
														echo '<td>'.ucfirst(strtolower($row['name'])).'</td>';
														echo '<td>'.ucfirst(strtolower($row['contact'])).'</td>';
														
														echo '<td class="center">';
															echo '<a class="btn btn-info btn-xs" href="'.SITE_URL.'admin/gebruikers_wijzigen.php?id='.$row['ID'].'" title="Wijzigen">
																<span class="glyphicon glyphicon-edit" style="margin-right:0;"></span>                                          
															</a> ';
															
														if(empty($disabled[$row['ID']])) 
														{
															echo '<a onclick="show_confirm('.$row['ID'].')" class="btn btn-danger btn-xs" title="Blokkeren">
																<span class="glyphicon glyphicon-remove" style="margin-right:0;"></span>                                          
															</a>';
														}
														else
														{
															echo '<a onclick="de_show_confirm('.$disabled[$row['ID']].')" class="btn btn-success btn-xs" title="Deblokkeren">
																<span class="glyphicon glyphicon-ok-sign" style="margin-right:0;"></span>                                          
															</a>';
														}
															
														echo '</td>';
													echo '</tr>';
												}
											}
											?>
                                        </tbody>
                                    </table>

Dat is ook een hoop HTML.
Probeer, zeker bij zoveel rijen zo min mogelijk HTML te tonen. Des te sneller is je overdracht.
Alle onclick() kunnen er uit. Vang dat af met 1 regel jQuery.
De class= kan er ook uit. Doe dit via table tr td.center a
Haal de title="" weg. Die is leuk, maar wordt in je applicatie toch niet gebruikt (sorry, html-validators)
Verwijder de inline CSS op je <span>

Je gebruikt glyphicon: is die niet traag? Verwijder class="glyphicon ...." eens. Gaat het dan sneller?

Je PHP kan niet veel sneller/beter.
Je SQL wellicht wel door INDEXES, al gebruik je die bij een SELECT * niet echt.


[size=xsmall]Toevoeging op 10/06/2015 19:03:04:[/size]

En als je echt snel wil zoeken: kijk eens naar AJAX en laat de database in de database zoeken ;)
Ik heb ook altijd 36.000 resultaten tegelijkertijd nodig, jij ook?

Honestly, hang er een limiet in en/of maak een slimmere in- of opdeling.

Bijvoorbeeld: op bedrijf(snaam) of beginletter van achternaam. Of maak er een zoekpaneeltje bij dat je zelf kunt sorteren en filteren.

Met 36.000 records tegelijkertijd uitspugen creëer je niet meer, maar minder overzicht. Dat is terug naar het spreadsheet tijdperk.
Eddy E op 10/06/2015 19:02:21

Je PHP kan niet veel sneller/beter.
Je SQL wellicht wel door INDEXES, al gebruik je die bij een SELECT * niet echt.

Je zou om de 100 rijen een ob_flush() of flush() kunnen zetten, zodat de client alvast beeld heeft. Dan is de applicatie nog steeds even traag (strikt genomen zelfs wat trager), maar valt het minder op.

Verder zou je de SELECT-query kunnen uitbreiden met een ORDER BY voor de meest gebruikte sorteervolgorde. De meeste gebruikers sorteren een tabel zó dat ze de belangrijkste rijen bovenaan zien. En dáárop zet je vervolgens ook een INDEX met ASC of DESC.

Aangezien je INT(20) gebruikt in de tabeldefinitie en een PRIMARY KEY ontbreekt, vermoed ik zo dat we niet de hele tabel zien of de tabel inderdaad niet goed is ingedeeld.

Ja, gaat goed:

Oeps...

Hier is even iets mis gegaan.

Reageren