Обратите внимание, что .MYI - это ваш индекс, а .MYD - это ваши данные. Единственный способ уменьшить размер вашего .MYD - это удалить строки или изменить размеры столбцов.
50 МБ для индекса на 2 миллиона строк невелико.
Давайте посмотрим на размер таблицы:
- company_id - 4 байта
- emp_number - 101 байт
- дата_карты - 11 байт
- total_ot - 17 байт
- total_per - 17 байт
- left_taken - 9 байт
- total_lop - 9 байт
- time_entry - средняя (длина (time_entry)) + 3 байта
Это дает нам длину строки 172 + time_entry байтов. Если time_entry составляет в среднем 100 байт. Вы смотрите на 272 * 2000000 = 544MB
Для меня важно количество VARCHAR. Номер сотрудника должен быть varchar (100), или даже varchar вообще? Вы полностью дублируете эти данные в своем индексе (company_id, emp_number, card_date) при индексации всего столбца.
Вам, вероятно, здесь не нужен varchar, и, возможно, он не включен в первичный ключ.
Вам действительно нужно time_entry, чтобы быть полем TEXT? Это, вероятно, самый большой потребитель пространства в вашей базе данных.
Почему вы используете varchar (10) для даты карты? Если бы вы использовали DATETIME, вы бы использовали только 8 байтов вместо 11, TIMESTAMP был бы 4 байта, а DATE был бы 3 байта.
Вы также добавляете 1 байт для каждого столбца, который может быть НЕДЕЙСТВИТЕЛЕН.
Также попробуйте запустить команды ANALYZE / REPAIR / OPTIMIZE TABLE.