0

我是否错过了加快此选择查询的任何技巧?查询在用户输入时获取位置数据,并自动填充。

$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"; 
}
4

1 回答 1

1

OR 通常被优化器处理得不好,因为只选择了一个索引,所以只有一半的 OR 可以从基于索引的搜索中受益。

将查询拆分为两个联合查询通常会提高性能,因为可以为每一半使用不同的索引,因此可以有效地使用两个索引 - 一个用于 OR 的每一侧。

group by此外,您的查询有一个应该删除的 unnessessaru 。

试试这个查询(没有不相关的应用代码):

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

如果是联合,则必须将 LIMIT 子句应用于结果。

确保您在 us_city 和 us_zip 上有单独的索引。

于 2013-09-05T00:15:26.390 回答