2

我正在开发一个程序(基于 Web 的 PHP、MySQL DB),其中包括世界各地所有城市的数据库,包含 250 万个条目(全部在一个表中)。当我尝试从中获取详细信息时,服务器(假设为 localhost,wamp)花了很多时间来搜索和获取数据。我在互联网上搜索以找到使用如此大数据的最乐观方法。我认为,一种方法是将此表缩小为每个国家/地区的不同表,以使搜索过程更容易。

谁能建议如何处理这个问题并分享知识?

编辑:该表包括两列。1. country2. city. 我用户WHERE country=XX使搜索过程更容易,但需要很长时间才能处理。

数据库:(表名cities:)

country city
US  Lakewood Estates
US  Lakewood Estates Mobile Home Park
US  Lakewood Falls
US  Lakewood Forest
US  Lakewood Gardens
US  Lakewood Harbor
US  Lakewood Heights
US  Lakewood Highlands
US  Lakewood Hills
.
.
.

PHP代码:

$data = mysql_query( "SELECT * FROM cities where country='".mysql_real_escape_string($_GET['country'])."' ORDER BY country" )
        or die( mysql_error() );

$i = 0;
while( $row = mysql_fetch_array( $data )){
    if ( strpos( strtolower( $row['city'] ), $q ) !== false ) {
        $i++;
        $arr[] = $row['city'];
        if ($i==10) {break;}
    }
}

echo "[";
for ($x=0; $x<count($arr); $x++)
  {
  echo '{"name":"'.$arr[$x].'"}';
   if ($x!=count($arr)-1) {echo ',';}
  }
echo "]";
4

2 回答 2

3

250 万个条目实际上并没有那么多。您需要根据检索数据(where子句)的方式添加适当的索引,然后它会更快。

像这样在国家/地区添加索引(首先您需要将列数据类型更改为varchar

ALTER TABLE cities MODIFY COLUMN country varchar(255);

ALTER TABLE cities
ADD INDEX country_idx (`country`);
于 2013-09-18T06:58:42.373 回答
0

执行以下操作以仅检索 10 个值可能更明智,但我可能错了吗?因为您正在检索所有记录WHERE country = XX,并且仅使用前 10 个返回的记录并丢弃其余记录。返回一个国家的所有记录可能会减慢您的查询速度。

SELECT * FROM cities where country='".mysql_real_escape_string($_GET['country'])."'
ORDER BY country LIMIT 10 (or what ever you want to limit to)

while( $row = mysql_fetch_array( $data )){
    if ( strpos( strtolower( $row['city'] ), $q ) !== false ) {
        $i++;
        $arr[] = $row['city'];
        if ($i==10) {break;}#remove this line
    }
}

也可能切换 MySQL 引擎可能会提高执行。

于 2013-09-18T07:28:36.247 回答