Оптимизация таблиц Mysql для повышения производительности

#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. Не могли бы вы показать примеры запросов, которые выполняются слишком медленно?