加快mysql选择查询

时间:2013-09-04 23:49:26

标签: mysql mysqli

我是否遗漏了加速此选择查询的任何技巧?查询是在用户输入位置数据时抓取位置数据,自动填充。

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

1 个答案:

答案 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上有单独的索引。