я использую 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
Я думаю, что этот стол слишком большой.
Это хорошая идея, чтобы использовать такие как Давайте сначала обсудим исправления MySQL.Cloud Bigtable
только для этого стола?
Есть ли решение?
мой стол:
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
к этому столу.
Вы можете найти 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 Пространственные Расширения Данных.
Для этого запроса:
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 может решить некоторые проблемы с производительностью, но может привести к другим. Вы не должны переключаться, пока не тщательно оцените весь спектр операций, которые нужны вашей системе.