Задать вопрос

Спроектировать таблицу БД GPS трекера

Добрый день!
Подскажите пожалуйста как лучше спроектировать таблицу для хранения координат.
В сутки с одной цели предполагается около 3000 записей (~ 90000 в месяц, ~ 1 мил. год).
Целей может быть много, сейчас все храниться в одной таблице порядка 3 мил. записей, и все очень жутко тормозит (индекс по времени и по цели), сервер VPS c 1 гб. Встала задача улучшить.
Я додумался только хранить для каждой цели координаты в отдельной таблице.
И думаю можно ли разделить дату и время на разные поля?
И подскажите какой размер у типа point? я ни где не нашел.

Подскажите гуру баз данных.

Спасибо.
  • Вопрос задан
  • 3759 просмотров
Подписаться 5 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
BuriK666
@BuriK666
Компьютерный псих
Может имеет смысл старые/неактуальные данные пихать в архив(в другую таблицу)?
Ответ написан
@anitspam
все очень жутко тормозит

а вы можете в цифрах привести, что именно тормозит и насколько? если это mysql тормозит, то можно посмотреть в логи, какие именно запросы.
например у меня был запрос с тремя join, выполнялся 5-10 секунд, я разделил его на два запроса и теперь данные выбираются гораздо быстрее (не попадают в mysql-slow.log).

Разбивать данные кстати тоже можно. После сбора статистики о том, какие данные просматривают. Например, за прошлый месяц могут смотреть каждый день, а за прошлый год совсем не смотреть.

Короче, для подсказок хорошо бы знать, что уже есть (дамп таблицы) и что не устраивает (пример запроса и сколько времени он выполняется).
Ответ написан
@rPman
Помимо партиционирования, я могу посоветовать из разряда 'вредных советов' (но лично так делал для более простых форматов хранения таблиц — myisam, с ними проще восстанавливать базу, вот с innodb я не очень в курсе, как легко будет поднять базу если индексный файл будет потерян)…

Разделите данные и индексы по разным файлам (а точнее физическим разделам, если конечно ваш тарифный план хостинга позволяет это). Индексы обычно занимают меньше места но основные тормоза при записи создают именно они (так как в них происходит перезапись порядка log(n) объемом данных (конечно все сложнее, много читается как из таблицы с данными так и из таблицы с индексами) и эта запись сервером баз данных делается в синхронном режиме.

Само по себе размещение индексов таблиц баз данных на более быстром (те же ssd) носителе заметно ускоряют работу, но я так понимаю это не ваш случай и предлагаю схитрить за счет понижения надежности, отключить синхронизацию записи данных для соответствующих файлов. Сделать это можно, разместив эти файлы на рам-диске (tmpfs) либо отформатировав их раздел под ext4 и примонтировать с опциями -o noatime,async,data=writeback.

Но прежде чем радоваться заметному повышению работу базы данных, рекомендую сначала протестировать и подготовить скрипты поднятия базы данных после нештатного выключения сервера (данные в tmpfs теряются безвозвратно, так же как некоторые данные для разделов, смонтированных с data=writeback). Так как на ненадежном хранилище размещаются не данные а индексы, то их потеря не критична (вопрос только во времени, требуемом для их полной перестройки).
Ответ написан
Комментировать
foxmuldercp
@foxmuldercp
Системный администратор, программист, фотограф
Как минимум понять размер базы, посчитать память, требуемую для SQL'я и поменять конфигурацию VPSки
ну а дальше — комплексный тюнинг апаратной и программной части сервера
Ответ написан
zBit
@zBit
Full stack web developer
Возможно я ошибаюсь и результаты тестов, которые я проводил весьма субъективные, НО.
Данные имели журнальный характер и простая выборка из таблицы MyISAM была быстрее, чем в Innodb.
И по формату времени «datetime», я стараюсь использовать везде timestamp. Может вам тоже стоит попробовать потестировать производительность с ним, вдруг будет быстрее?)
И ещё один момент «archive_date >= '2013-01-01' and archive_date <= '2013-02-01'». Вот так «archive_date between '2013-01-01' and '2013-02-01'», на мой взгляд, выглядит как-то кошернее. Но я не супер спец, конечно и поэтому, возможно, в чём-то ошибаюсь.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы