Files
mysql-haversine-benchmark/index.php
2025-04-25 13:19:27 -07:00

138 lines
4.5 KiB
PHP

<?php
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) {
header('HTTP/1.0 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Database access"');
echo 'Unauthorized access. Please provide valid credentials.';
exit;
}
$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>';
flush();
print '<dl>';
$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);
flush();
$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);
flush();
$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);
flush();
$start = microtime(true);
$result = mysqli_query($con, "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>';
flush();
$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);
print '<dt>floats : php</dt>';
print '<dd>Time taken: ' . ($end - $start) . '</dd>';
print '<dd>Results: ' . count($results) . '</dd>';
flush();
$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);
flush();
$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>';
flush();
$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);
flush();
$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>';
print '</dl>';
function haversine($latFrom, $lonFrom, $latTo, $lonTo)
{
// convert from degrees to radians
$latFrom = deg2rad($latFrom);
$lonFrom = deg2rad($lonFrom);
$latTo = deg2rad($latTo);
$lonTo = deg2rad($lonTo);
$latDelta = $latTo - $latFrom;
$lonDelta = $lonTo - $lonFrom;
$angle = sin($latDelta / 2) * sin($latDelta / 2) +
cos($latFrom) * cos($latTo) *
sin($lonDelta / 2) * sin($lonDelta / 2);
$chord = 2 * atan2(sqrt($angle), sqrt(1 - $angle));
return 3959 * $chord; // as miles
}