GPS таблица 600000 пользователей

я использую mysql, мой язык программирования php,

У меня есть 600.000 пользователей, которые я получаю lat а также lon из этих пользователей по сотовому телефону каждые 10 секунд один раз.

некоторые из моих запросов на эту таблицу:

  • ближайший из пользователей с определенным lan а также lon,
  • получить последний lan а также lon каждого пользователя каждую минуту.

некоторые из моих запросов 7-14 секунд занимают время вроде:

SELECT m1.*
FROM gps m1 LEFT JOIN gps m2
ON (m1.driver_id = m2.driver_id AND m1.id < m2.id)
WHERE m2.id IS NULL

Я думаю, что этот стол слишком большой.

Это хорошая идея, чтобы использовать такие как Cloud Bigtable только для этого стола?
Есть ли решение?
Давайте сначала обсудим исправления MySQL.

мой стол:

CREATE TABLE `gps` (
`id` int(11) NOT NULL,
`driver_id` int(11) NOT NULL,
`trucks_drivers_id` int(11) NOT NULL,
`x` varchar(100) COLLATE utf8_persian_ci NOT NULL,
`y` varchar(100) COLLATE utf8_persian_ci NOT NULL,
`speed` varchar(100) COLLATE utf8_persian_ci NOT NULL,
`time_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci;

Я не ставлю никаких indexs к этому столу.

0

Решение

Вы можете найти id последнего чтения для каждого водителя, как это.

           SELECT MAX(id) id
FROM gps
GROUP BY driver_id

Индекс на (driver_id, id) поможет этот запрос. Затем этот запрос находит последнюю позицию каждого драйвера.

       SELECT a.lat, a.lon, a.driver_id
FROM gps a
JOIN (
SELECT MAX(id) id
FROM gps
GROUP BY driver_id
) b ON a.id = b.id

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

Pro совет: Более короткие столбцы быстрее, особенно в больших таблицах. Столбцы фиксированной длины работают быстрее, особенно в больших таблицах. Не использовать varchar(100) хранить значения широты / долготы. Если эти значения получены из GPS, используйте FLOAT, Если они приходят от съемки или использования фотограмметрии DOUBLE, Или рассмотрите возможность использования MySQL Пространственные Расширения Данных.

3

Другие решения

Для этого запроса:

SELECT m1.*
FROM gps m1 LEFT JOIN
gps m2
ON m1.driver_id = m2.driver_id AND m1.id < m2.id
WHERE m2.id IS NULL;

Вы хотите индекс на gsp(driver_id, id), Возможно, у вас уже есть этот индекс.

По вашему вопросу вы вернете 600 000 строк. Большая часть времени может быть потрачена на возвращение строк, а не на генерацию набора результатов.

Если вы хотите обрабатывать данные ГИС, рассмотрите возможность использования Расширение ГИС. Переход на решение NO-SQL может решить некоторые проблемы с производительностью, но может привести к другим. Вы не должны переключаться, пока не тщательно оцените весь спектр операций, которые нужны вашей системе.

1

По вопросам рекламы [email protected]