There's one little secret I should confess to. I used mysql_unbuffered_query() (which more people should use, depending on the problem).

The same done with mysql_query looks like this -

The final code (replace your mysql_query(_unbuffered) as you choose);

PHP Code:
class SpeedTest {
$db;    // Database resource
var $query// Query resource
var $start// Start time
function SpeedTest () {
$this->db=mysql_pconnect('localhost','user','pass'); // Enter correct values here
mysql_select_db('dbname',$this->db); // Enter correct dbname here
$usec$sec) = explode(" ",microtime()); 
        return ((float)
$usec + (float)$sec); 
fetch() {
$this->query=mysql_query('SELECT * FROM products',$this->db); // Perform query here
getTime() {
        return (
getRow () {
        if ( 
$row=mysql_fetch_array($this->query,MYSQL_ASSOC) )
$sTest=new SpeedTest;
<title>PHP Speed Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="blah.css" rel="stylesheet" type="text/css">
<p><b>Query Took: <?php print ($sTest->getTime()); ?></b></p>

  <table width="100%" border="0" cellspacing="0" cellpadding="0">
    <tr class="box1">
while ( $row=$sTest->getRow() ) {
      <td><?php print ( $row['PRODUCTID']); ?></td>
      <td><?php print ( $row['PRODUCTNAME']); ?></td>
      <td><?php print ( $row['SUPPLIERID']); ?></td>
      <td><?php print ( $row['CATEGORYID']); ?></td>
      <td><?php print ( $row['QUANTITYPERUNIT']); ?></td>
      <td><?php print ( $row['UNITPRICE']); ?></td>
      <td><?php print ( $row['UNITSINSTOCK']); ?></td>
      <td><?php print ( $row['UNITSONORDER']); ?></td>
      <td><?php print ( $row['REORDERLEVEL']); ?></td>
      <td><?php print ( $row['DISCONTINUED']); ?></td>
<p><b>Page Took: <?php print ( $sTest->getTime() ); ?></b></p>
I've moved out the CSS now to make it easier to read.

One thing I'd like to see D add is another of these;

<ASP:Label id="endLoadTime" runat="server" Text="Loading..."></ASP:Label>
...which is placed at the end of the page after the table building is done.

Better yet would be placing VB directly at the bottom, if possible, to guarantee it gets executed at the very last: I'm not convinced by the trace output.

If anyone wants to try an ASP.NET to MySQL, recommend using one of these not ODBC.