2

私は、世界中のすべての都市のデータベースを 250 万エントリ (すべて 1 つのテーブルに) 含むプログラム (Web ベースの PHP、MySQL DB) を開発しています。そこから詳細を取得しようとすると、サーバー(ローカルホスト、ワンプを想定)がデータを検索して取得するのに非常に時間がかかりました。このような大規模なデータを使用する最も楽観的な方法を見つけるために、インターネットを検索しました。1 つの方法は、検索プロセスを容易にするために、このテーブルを国ごとに異なるテーブルに縮小することだと思います。

誰かがこれを処理して知識を共有する方法を提案できますか?

編集: テーブルには 2 つの列が含まれています。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 に答える