2013-09-18 2 views
2

Я разрабатываю программу (Webbased PHP, MySQL DB), которая включает в себя базу данных по всем городам мира по 2,5 миллионам записей (все в одной таблице). Когда я пытаюсь получить данные от него, серверу (предположим, localhost, wamp) потребовалось столько времени, чтобы искать и захватывать данные. Я искал через Интернет, чтобы найти наиболее оптимистичный способ использования таких больших данных. Одним из способов, я думаю, является сокращение этой таблицы до разных таблиц для каждой страны, чтобы упростить процесс поиска.Лучший способ обработки базы данных mysql с записями 2.5M

Может ли кто-нибудь предложить, как справиться с этим и поделиться знаниями?

EDIT: В таблице указаны две колонки. 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

Это не так много, MySQL даже на VPS может обрабатывать гораздо больше. Но не забывайте об индексах и оптимизации ваших запросов. –

+1

Пожалуйста, добавьте структуру и запрос таблицы. Таким образом, мы можем видеть, где вам не хватает индексов и как вы извлекаете данные. –

+1

Индексы могут вам помочь. – unknownbits

ответ

3

2,5 миллиона записей на самом деле не так много. Вам нужно добавить соответствующие индексы в зависимости от способа получения ваших данных (where), тогда он будет быстрее.

добавить индекс по стране, как это (первое что вам нужно изменить тип данных столбца varchar:

ALTER TABLE cities MODIFY COLUMN country varchar(255); 

ALTER TABLE cities 
ADD INDEX country_idx (`country`); 
+0

Таблица содержит два столбца. 1.country 2.city. Я пользователь 'WHERE country = XX', чтобы упростить процесс поиска, но для обработки требуется много времени. –

+0

Я обновил вопрос. –

+0

@ImanHejazi: Вы добавили индекс? –

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 двигатели могут улучшить выполнение.

+0

Спасибо за ответ. Что такое LIMIT 10? Какие 10 предметов выбраны? Когда я установил 'LIMIT = 10', результаты исчезнут. –

+0

@ImanHejazi 'LIMIT 10' возвращает первые 10 результатов после сортировки/группировки, а также' = 'не должно быть в LIMIT, и это должен быть последний элемент в вашем запросе – Class

+0

Извините за' = 'Это было ошибочно , Я рассматриваю эту проблему. –

Смежные вопросы