Под «выделенными стеками» они подразумевают множество серверов.Подумайте о стоимости.
Есть несколько вещей, которые можно сделать без использования оборудования.
Пожалуйста, укажите SHOW CREATE TABLE
для каждой таблицы;Между тем, я предполагаю, что у вас нет (или бесполезных) индексов.Я проверю типы данных, чтобы увидеть, что может быть сжато - чтобы сэкономить дисковое пространство и некоторое время.
Мне не нравится широкий диапазон используемой точности - DOUBLE
имеет 16 значащих цифр;69
имеет только 2. Рассмотрим 69.172
.См. Функцию RADIAN
вместо 8-значного числа pi / 180.
dist/abs(cos(radians(xLat))*69)
можно оценить один раз (для небольшого ускорения)
ABS()
, вероятно, не требуется.
Без индекса запрос будет сканировать всю таблицу.По крайней мере, есть INDEX(latitude)
и INDEX(longitude)
.Это изменило бы усилия с 550К тестов до 2К.Чтобы сократить его до, возможно, 30, вам потребуется значительное переписывание, например, http://mysql.rjweb.org/doc.php/latlng
Вероятно, в половине случаев «устройство» находится в «том же« месте ».(Это особенно верно для транспортных средств.) В этом случае, запустите , увидев, не было ли устройство перемещено с момента его последнего обнаружения.
Это поднимает еще одну проблему - несохранить местоположение, если оно не переместилось значительно.Это сэкономило бы половину дискового пространства.
Еще одна мысль - изменить ожидания клиента.Не размещайте устройство каждую минуту, а только каждые 10 минут.Это само по себе изменит время вычислений с 1 дня до 2,4 часов.
Комментарии к схеме:
FLOAT
занимает 4 байта;их можно превратить в какой-то меньший тип данных?широта / долгота несовместимы.См. this для некоторых вариантов выбора. - Что такое
geoFences
и resol
? - Не используйте (m, n) сFLOAT (например, float (10,7)).
Если вы будете получать все данные для одного устройства за раз, тогда измените
PRIMARY KEY (`tripID`),
KEY `deviceID` (`deviceID`),
на
PRIMARY KEY (`deviceID`, tripID),
KEY (`tripID`),
Это будет лучше использовать преимущества "кластеризации".Но вы также должны изменить на InnoDB.
Вам нужно будет удалить «дубликаты» записей, когда устройство остановлено.Иначе у вас будут проблемы с дисковым пространством (и проблемами с производительностью).
Не так, как на YouTube
У YouTube проблемы разные;То же самое для большинства других важных персон.Не беспокойтесь об их изучении.
Я полагаю, что проблема номер один - это объем данных.
- Меньше столбцов.
- Меньше строк.
- Суммируйте информацию.
24 столбца - Некоторые из них не меняются ни на минуты, ни на весь день.Поэтому не храните их все время.
Разделите 24 столбца.Какой основной запрос?Каким образом несколько столбцов необходимы для его поддержки?То есть построить up таблицу из 0 столбцов;Вы добьетесь большего прогресса быстрее, чем попытаетесь сократить число столбцов в 24 раза.
Одна строка каждые 15 секунд.Даже когда «устройство» выключено?Это огромная экономия.
Пересчитать название города, в котором находится устройство?Но это обычно в том же городе, что и в прошлый раз.Проверьте это first .Это должно сэкономить много процессорного времени.
Использовать 3-байтовый MEDIUMINT UNSIGNED
для 'city'.Вот что должно быть poiID
, а не 4 байта INT SIGNED
.JOIN
будет достаточно дешевым при отображении имени.
Старение.Конечно, клиенту нужны вчерашние детали.Но, может быть, данные за прошлый месяц могут быть лучше?А прошлогодние еще менее подробные - возможно, даже брошенные?
Если вы будете отбрасывать «старые» данные, сейчас самое время PARTITION
таблицы.так что очистка будет «мгновенной».
и т. д.И т.д.