MySQL таблица с 4 000 000 записей? - PullRequest
2 голосов
/ 15 мая 2011

Веб-сайт, которым я должен управлять, - это поисковая система для работника (стиль желтой страницы)

Я создал такую ​​базу данных:

People: <---- 4,000,000 records
id
name
address
id_activity <--- linked to the activites table
tel
fax
id_region <--- linked to the regions table

activites: <---- 1500 activites
id
name_activity

regions: <--- 95 regions
id
region_name

locations: <---- 4,000,000 records
id_people
lat
lon

Таким образом, в основном запрос, с которым у меня медленная проблема, состоит в том, чтобы выбрать всех «рабочих» вокруг выбранного города (выбирается пользователем)

Созданный мною запрос полностью работает, но для возврата результатов требуется 5-6 секунд ...

В основном я делаю выбор в расположении таблицы, чтобы выбрать весь город в определенном радиусе, а затем присоединяюсь к таблице людей

  SELECT people.*,id, lat, lng, poi,  
         (6371 * acos(cos(radians(plat)) * cos(radians(lat)) * cos(radians(lng) - radians(plon)) + sin(radians(plat)) * sin(radians(lat)))) AS distance 
    FROM locations,
         people 
   WHERE locations.id = people.id 
  HAVING distance < dist 
ORDER BY distance LIMIT 0 , 20; 

Мои вопросы:

  1. Хорошо ли разработана моя база данных? Я не знаю, будет ли хорошей идеей иметь 2 таблицы с 4 000 000 записей в каждой. Можно ли делать выбор?
  2. Мой запрос плохо оформлен?
  3. Как я могу ускорить поиск?

Ответы [ 2 ]

4 голосов
/ 15 мая 2011
  1. Дизайн выглядит нормализованным.Это то, что я ожидал увидеть в большинстве хорошо спроектированных баз данных.Количество данных в таблицах важно, но вторично. Однако , если между People и Locations есть корреляция 1: 1, как следует из вашего запроса, я бы сказал, что таблицы должны быть одной таблицей.Это , безусловно, поможет.

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

  3. Вам нужно проиндексировать ваши таблицы .Это то, что обычно помогает больше всего с медлительностью (так как большинство разработчиков вообще не учитывают индексы базы данных).

0 голосов
/ 15 мая 2011

Есть несколько основных вещей, которые могут заставить ваш запрос выполняться медленно.

Каковы ваши индексы на ваших таблицах? Вы объявили первичные ключи в таблицах? Объединение двух таблиц, каждая из которых содержит 4M строк, без индексов, приводит к большой нагрузке на БД. Убедитесь, что вы правильно поняли это.

Если вы уже создали правильные индексы для своей БД, вы можете посмотреть на данные кэширования. Вы делаете расчет в своем запросе. Как правило, фиксированные местоположения (широта / долгота)? Как часто они меняются? Являются ли элементы в ваших таблицах мест фактическими местами (города, здания и т. Д.), Или они представляют собой записи о том, где люди находились (например, проверки Foursquare)?

Если ваши местоположения являются местами, вы можете сделать много приятных оптимизаций, если изолируете части ваших данных, которые изменяются нечасто, и предварительно рассчитывает расстояния между ними.

Если ничего не помогает, убедитесь, что на вашем сервере базы данных достаточно оперативной памяти. Если сервер сможет хранить ваши данные в памяти, это значительно ускорит процесс.

...