#mysql #percona #mysql-5.6
#mysql #percona #mysql-5.6
Вопрос:
CREATE TABLE Car (
`id` bigint(30) NOT NULL,
`name` varchar(40) COLLATE utf8_unicode_ci NOT NULL
)
CREATE TABLE Checkpoints (
`id` bigint(30) NOT NULL AUTO_INCREMENT,
`car_id` int(11) NOT NULL,
`check_point_name` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
`expected_time` datetime DEFAULT NULL,
`actual_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_car_id` (`car_id`),
KEY `car` (`check_point_name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
mysql> select * from car;
---- ---------
| id | name |
---- ---------
| 1 | Ferrari |
---- ---------
mysql> select * from Checkpoints;
---- -------- ------------------ --------------------- ---------------------
| id | car_id | check_point_name | expected_time | actual_time |
---- -------- ------------------ --------------------- ---------------------
| 1 | 1 | Point1 | 2021-02-01 15:00:00 | 2021-02-15 15:01:00 |
| 2 | 1 | Point2 | 2021-02-01 15:20:00 | 2021-02-01 15:23:19 |
| 3 | 1 | Point3 | 2021-02-01 15:30:00 | 2021-02-01 15:32:19 |
| 4 | 1 | Point4 | 2021-02-01 15:40:00 | 2021-02-01 15:40:19 |
| 5 | 1 | Point5 | 2021-02-01 15:50:00 | 2021-02-01 15:50:19 |
| 6 | 1 | Point5 | 2021-02-01 15:50:00 | 2021-02-01 15:50:00 |
---- -------- ------------------ --------------------- ---------------------
Текущая версия mysql: 5.6.44
Для каждого автомобиля будет несколько контрольных точек и их ожидаемое и фактическое время прибытия. Проблема, с которой я сталкиваюсь, таблица track_car продолжает расти в огромную таблицу по размеру, что приводит к медленным запросам и снижению производительности mysql (выше приведен лучший пример, который я могу придумать, чтобы объяснить проблему :)).
Чтобы оптимизировать эту таблицу, подумайте о перемещении данных track_car в одну строку JSON / Text, содержащую строку JSON со всеми этими значениями.
Может кто-нибудь предложить, есть ли у нас какой-либо другой подход к решению этой растущей таблицы.
Комментарии:
1. Существует ли какая-либо корреляция между eta первой контрольной точки и последующих контрольных точек (похоже, что есть)
2. Да, это своего рода план, а затем отслеживание фактического выполнения плана. Спасибо, что указали, обновили имя таблицы (Mybad)
3. Поэтому вам не нужно хранить эту информацию. Вам нужно только сохранить контрольную точку, автомобиль и фактическое время. И одна строка для каждой записи кажется разумным подходом. Если бы у вас была тысяча автомобилей и тысяча контрольных точек, это составило бы 1 миллион строк — тривиальное число для современного ядра базы данных.
4. Хранение этих данных в формате json фактически увеличило бы размер таблицы, поскольку даже числа и даты будут сохранены в виде текста. Здесь вы мало что можете улучшить в структуре таблицы (индексы по датам, если вы хотите выполнить поиск по датам). Если у вас действительно есть база данных, увеличивающаяся на 7-800 тыс. / день, то вам, вероятно, придется изменить конфигурацию, перейти на более новую версию mysql или просто инвестировать в лучшее оборудование / облачный сервис.
5. Не могли бы вы показать примеры запросов, которые выполняются слишком медленно?