138 lines
4.5 KiB
PHP
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
|
|
}
|
|
|