сохранить каждый вызов в отдельной таблице клиента (например, call_ {client_id}) по историческим причинам
Нет. Не нарушайте правила нормализации, если у вас нет веских причин. Это не улучшит производительность и может быть очень вредным. Это, безусловно, сделает ваш код более сложным и, следовательно, менее надежным.
Это может стоить архивировать старые записи по периодам, но если вы не знаете, что у вас возникнут проблемы с производительностью, я бы посоветовал против этого.
Любая предварительная консолидация данных в другую таблицу (при условии, что вы получаете сокращение числа строк не менее чем на 95%). Но не пытайтесь преобразовать его в XML до тех пор, пока вам не понадобятся данные в этом формате.
Что касается предварительной консолидации .... либо используйте консолидацию на основе периодов (например, сверните по дате), либо используйте пометки для записи, какие записи уже были консолидированы.
Чем реже вы выполняете консолидацию, тем больше влияние на производительность. Но запускайте его слишком часто, и у вас будут проблемы с конфликтами / блокировками.
Не зная много о структуре и объеме данных или ограничениях с точки зрения бюджета, доступности и своевременности, трудно найти оптимальное решение. Но если бы я был, я бы, вероятно, пошел с 3-мя уровнями mysqld - один обеспечивает средство транзакционной записи, один реплицирует эти данные и генерирует консолидированные данные, а другой обеспечивает доступ для чтения консолидированных данных (master <-> master <- > раб)