Test indexed vs non-indexed datasets

Improve benchmark UI

Disable function and php tests (they are very slow)
This commit is contained in:
2025-05-05 13:47:08 -07:00
parent e48fd1bd53
commit d8b0777a3b
3 changed files with 280 additions and 88 deletions

266
index.php
View File

@@ -11,110 +11,194 @@ $username = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];
$con = mysqli_connect("localhost", $username, $password, "test");
print '<p>Total rows: ' . mysqli_num_rows(mysqli_query($con, "SELECT * FROM floats;")) . '</p>';
print '<p>Selecting rows within 50 miles of Seattle...</p>';
print '<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Haversine Query Benchmarks</title>
<style>
table {
border-collapse: collapse;
thead {
background-color: #ddd;
}
tr.disabled {
background-color: #f2f2f2;
color: #999;
}
th, td {
border: 1px solid black;
padding: 0.8rem 1rem;
text-align: left;
pre {
margin: 0;
}
}
}
</style>
</head>
<body>
<p>Total rows: ' . mysqli_num_rows(mysqli_query($con, "SELECT * FROM floats;")) . '</p>
<p>Selecting rows within 50 miles of Seattle...</p>
<table>
<thead>
<tr>
<th>Test</th>
<th>Time taken</th>
<th>Query</th>
<th>Results</th>
</tr>
</thead>
<tbody>
';
flush();
print '<dl>';
test(
$con,
'floats : procedure',
"CALL float_coords_within_radius(47.6, -122.33, 50);" // Within 50 miles of Seattle
);
$start = microtime(true);
$result = mysqli_query($con, "CALL float_coords_within_radius(47.6, -122.33, 50);"); // Within 50 miles of Seattle
$end = microtime(true);
print '<dt>floats : procedure</dt>';
print '<dd>Time taken: ' . ($end - $start) . '</dd>';
print '<dd>Results: ' . mysqli_num_rows($result) . '</dd>';
mysqli_next_result($con);
test(
$con,
'floats_indexed : procedure',
"CALL float_indexed_coords_within_radius(47.6, -122.33, 50);" // Within 50 miles of Seattle
);
flush();
test(
$con,
'floats : function',
"SELECT * FROM floats WHERE haversine(lat, lon, 47.6, -122.33) < 50;", // Within 50 miles of Seattle
false // disabled
);
$start = microtime(true);
$result = mysqli_query($con, "SELECT * FROM floats WHERE haversine(lat, lon, 47.6, -122.33) < 50;"); // Within 50 miles of Seattle
$end = microtime(true);
print '<dt>floats : function</dt>';
print '<dd>Time taken: ' . ($end - $start) . '</dd>';
print '<dd>Results: ' . mysqli_num_rows($result) . '</dd>';
mysqli_next_result($con);
test(
$con,
'floats : function alt',
"SELECT * FROM floats WHERE haversine_alt(lat, lon, 47.6, -122.33) < 50;", // Within 50 miles of Seattle
false // disabled
);
flush();
test(
$con,
'floats_indexed : function',
"SELECT * FROM floats_indexed WHERE haversine(lat, lon, 47.6, -122.33) < 50;", // Within 50 miles of Seattle
false // disabled
);
$start = microtime(true);
$result = mysqli_query($con, "SELECT * FROM floats WHERE haversine_alt(lat, lon, 47.6, -122.33) < 50;");
$end = microtime(true);
print '<dt>floats : function alt</dt>';
print '<dd>Time taken: ' . ($end - $start) . '</dd>';
print '<dd>Results: ' . mysqli_num_rows($result) . '</dd>';
mysqli_next_result($con);
test(
$con,
'floats_indexed : function alt',
"SELECT * FROM floats_indexed WHERE haversine_alt(lat, lon, 47.6, -122.33) < 50;", // Within 50 miles of Seattle
false // disabled
);
flush();
$start = microtime(true);
$result = mysqli_query($con, "SELECT * FROM floats where acos(
test(
$con,
'floats : inlined',
"SELECT * FROM floats WHERE acos(
cos(radians(lat)) *
cos(radians(47.6)) *
cos(radians(lon) - radians(-122.33)) +
sin(radians(lat)) *
sin(radians(47.6))
) * 3959 < 50;"); // Within 50 miles of Seattle
$end = microtime(true);
print '<dt>floats : inlined</dt>';
print '<dd>Time taken: ' . ($end - $start) . '</dd>';
print '<dd>Results: ' . mysqli_num_rows($result) . '</dd>';
) * 3959 < 50;" // Within 50 miles of Seattle
);
flush();
test(
$con,
'floats_indexed : inlined',
"SELECT * FROM floats_indexed WHERE acos(
cos(radians(lat)) *
cos(radians(47.6)) *
cos(radians(lon) - radians(-122.33)) +
sin(radians(lat)) *
sin(radians(47.6))
) * 3959 < 50;" // Within 50 miles of Seattle
);
$results = [];
$start = microtime(true);
$result = mysqli_query($con, "SELECT * FROM floats;");
while ($row = mysqli_fetch_assoc($result)) {
if (haversine($row['lat'], $row['lon'], 47.6, -122.33) < 50) { // Within 50 miles of Seattle
$results[] = $row;
}
{
// $results = [];
// $start = microtime(true);
// $result = mysqli_query($con, "SELECT * FROM floats;");
// while ($row = mysqli_fetch_assoc($result)) {
// if (haversine($row['lat'], $row['lon'], 47.6, -122.33) < 50) { // Within 50 miles of Seattle
// $results[] = $row;
// }
// }
// $end = microtime(true);
// row('floats : php', $end - $start, 'SELECT * FROM floats;', count($results));
row('floats : php', 'disabled', 'SELECT * FROM floats;', 0, true); // disabled
}
$end = microtime(true);
print '<dt>floats : php</dt>';
print '<dd>Time taken: ' . ($end - $start) . '</dd>';
print '<dd>Results: ' . count($results) . '</dd>';
flush();
test(
$con,
'hybrid : procedure',
'CALL hybrid_coords_within_radius(47.6, -122.33, 80467);' // Within 80,467 meters (50 miles) of Seattle
);
$start = microtime(true);
$result = mysqli_query($con, "CALL hybrid_coords_within_radius(47.6, -122.33, 80467);"); // Within 80,467 meters (50 miles) of Seattle
$end = microtime(true);
print '<dt>hybrid : procedure</dt>';
print '<dd>Time taken: ' . ($end - $start) . '</dd>';
print '<dd>Results: ' . mysqli_num_rows($result) . '</dd>';
mysqli_next_result($con);
test(
$con,
'hybrid_point : procedure',
'CALL hybrid_coords_within_radius_point(POINT(-122.33, 47.6), 80467);' // Within 80,467 meters (50 miles) of Seattle
);
flush();
test(
$con,
'hybrid_indexed : procedure',
'CALL hybrid_indexed_coords_within_radius(47.6, -122.33, 80467);' // Within 80,467 meters (50 miles) of Seattle
);
$start = microtime(true);
$result = mysqli_query($con, "SELECT * FROM floats WHERE ST_DISTANCE_SPHERE(POINT(-122.33, 47.6), POINT(lon, lat)) < 80467;"); // Within 80,467 meters (50 miles) of Seattle
$end = microtime(true);
print '<dt>hybrid : inlined</dt>';
print '<dd>Time taken: ' . ($end - $start) . '</dd>';
print '<dd>Results: ' . mysqli_num_rows($result) . '</dd>';
test(
$con,
'hybrid_indexed_point : procedure',
'CALL hybrid_indexed_coords_within_radius_point(POINT(-122.33, 47.6), 80467);' // Within 80,467 meters (50 miles) of Seattle
);
flush();
test(
$con,
'hybrid : inlined',
"SELECT * FROM floats WHERE ST_DISTANCE_SPHERE(POINT(-122.33, 47.6), POINT(lon, lat)) < 80467;", // Within 80,467 meters (50 miles) of Seattle
);
$start = microtime(true);
$result = mysqli_query($con, "CALL point_coords_within_radius(POINT(-122.33, 47.6), 80467);"); // Within 80,467 meters (50 miles) of Seattle
$end = microtime(true);
print '<dt>points : procedure</dt>';
print '<dd>Time taken: ' . ($end - $start) . '</dd>';
print '<dd>Results: ' . mysqli_num_rows($result) . '</dd>';
mysqli_next_result($con);
test(
$con,
'hybrid_indexed : inlined',
"SELECT * FROM floats_indexed WHERE ST_DISTANCE_SPHERE(POINT(-122.33, 47.6), POINT(lon, lat)) < 80467;" // Within 80,467 meters (50 miles) of Seattle
);
flush();
test(
$con,
'points : procedure',
"CALL point_coords_within_radius(POINT(-122.33, 47.6), 80467);" // Within 80,467 meters (50 miles) of Seattle
);
$start = microtime(true);
$result = mysqli_query($con, "SELECT * FROM points WHERE ST_DISTANCE_SPHERE(POINT(-122.33, 47.6), coord) < 80467;"); // Within 80,467 meters (50 miles) of Seattle
$end = microtime(true);
print '<dt>points : inlined</dt>';
print '<dd>Time taken: ' . ($end - $start) . '</dd>';
print '<dd>Results: ' . mysqli_num_rows($result) . '</dd>';
test(
$con,
'points_indexed : procedure',
"CALL point_indexed_coords_within_radius(POINT(-122.33, 47.6), 80467);" // Within 80,467 meters (50 miles) of Seattle
);
print '</dl>';
test(
$con,
'points : inlined',
"SELECT * FROM points WHERE ST_DISTANCE_SPHERE(POINT(-122.33, 47.6), coord) < 80467;" // Within 80,467 meters (50 miles) of Seattle
);
test(
$con,
'points_indexed : inlined',
"SELECT * FROM points_indexed WHERE ST_DISTANCE_SPHERE(POINT(-122.33, 47.6), coord) < 80467;" // Within 80,467 meters (50 miles) of Seattle
);
print '</tbody>
</table>
</body>
</html>
';
function haversine($latFrom, $lonFrom, $latTo, $lonTo)
{
@@ -135,3 +219,29 @@ function haversine($latFrom, $lonFrom, $latTo, $lonTo)
return 3959 * $chord; // as miles
}
function test($con, $name, $query, $enabled = true)
{
if (!$enabled) {
row($name, 'disabled', $query, 0, true);
return;
}
$start = microtime(true);
$result = mysqli_query($con, $query);
$end = microtime(true);
row($name, $end - $start, $query, mysqli_num_rows($result));
try {
mysqli_next_result($con);
} catch (Exception $e) {}
}
function row($name, $duration, $query, $results, $disabled = false)
{
print '<tr' . ($disabled ? ' class="disabled"' : '') . '>
<td>' . htmlspecialchars($name) . '</td>
<td><time>' . $duration . '</time></td>
<td><pre>' . htmlspecialchars($query) . '</pre></td>
<td>' . $results . '</td>
</tr>
';
flush();
}