我正在开发一个程序(基于Web的PHP,MySQL数据库),其中包含2.5M条目(全部在一个表中)的全球所有城市的数据库。当我尝试从中获取详细信息时,服务器(假设localhost,wamp)花了这么多时间来搜索和获取数据。 我通过互联网搜索,找到使用这么大数据的最乐观方式。 我认为,一种方法是将此表缩小到每个国家/地区的不同表格,以便简化搜索过程。
有人可以建议如何处理这个并分享知识吗?
编辑:
该表包括两列。 1。country
2。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 "]";
答案 0 :(得分:3)
250万条目实际上并没有那么多。您需要根据检索数据的方式(where
子句)添加适当的索引,然后它会更快。
在这样的国家/地区添加索引(首先您需要将列数据类型更改为varchar
:
ALTER TABLE cities MODIFY COLUMN country varchar(255);
ALTER TABLE cities
ADD INDEX country_idx (`country`);
答案 1 :(得分: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引擎可能会改善执行。