The Daily WTF на русском
Подписаться
CodeSOD: Последний ID
Компания Криса столкнулась с неожиданным резким ростом затрат на передачу данных, когда их веб-приложение, размещенное у облачного провайдера B, взаимодействовало с базой данных MySQL у облачного провайдера A. Они ожидали ежемесячную передачу данных всего в несколько гигабайт. Однако они столкнулись с терабайтами, что значительно превысило их бюджет. Расследование показало, что каждая операция вставки извлекала огромный объем данных. Первопричиной был некорректно составленный SQL-запрос: SELECT last_insert_id() FROM some_table_name. Этот запрос, вместо того чтобы просто получить последний вставленный ID, был настроен на возврат этого ID для каждой строки в указанной таблице. Поскольку таблица содержала миллионы строк, это приводило к тому, что миллионы повторений последнего вставленного ID отправлялись обратно с каждой вставкой. В результате каждая операция вставки генерировала значительную передачу данных объемом примерно 30 МБ. Внедрение технического исправления было простым. Однако координация изменений с компанией-разработчиком веб-приложений и их хостинговой средой, включая тестирование и развертывание, заняла шесть недель. Часть этого времени была потрачена на убеждение веб-разработчиков в том, что проблема действительно существует и вызвана их кодом.