我是否遗漏了加速此选择查询的任何技巧?查询是在用户输入位置数据时抓取位置数据,自动填充。
$q = mysqli_real_escape_string(strtolower($_GET["q"]));
if (!$q) return;
$sql = "SELECT us_city AS city, us_abv AS state, us_zip AS zip
FROM search_us
WHERE us_zip LIKE '$q%' OR us_city
LIKE '$q%' GROUP BY us_abv, us_city, us_zip LIMIT 15";
$places = mysqli_query($sql);
while($place = mysqli_fetch_array($places)) {
echo "$place[city], $place[state], $place[zip]\n";
}
答案 0 :(得分:1)
优化器通常会很难处理OR,因为只选择了一个索引,因此只有一半的OR可以从基于索引的搜索中受益。
将查询拆分为两个联合查询通常会提高性能,因为每一半都可以使用不同的索引,因此可以有效地使用两个索引 - 一个用于OR的每一侧。
此外,您的查询还有一个应该删除的unnessessaru group by
。
尝试此查询(没有不相关的应用代码):
SELECT * FROM (
SELECT
us_city AS city,
us_abv AS state,
us_zip AS zip
FROM search_us
WHERE us_city LIKE '$q%'
UNION
SELECT
us_city AS city,
us_abv AS state,
us_zip AS zip
FROM search_us
WHERE us_zip LIKE '$q%') x
LIMIT 15
如果是union,则必须将LIMIT子句应用于结果。
确保在us_city和us_zip上有单独的索引。