Давайте предположим, что есть статья в первой таблице и во второй таблице например какие-то записи статистики просмотров, ну и таблицы связаны по ключу с типом CASCADE на удаление и редактирование.
Теперь предположим, что 1 статью просмотрели миллион раз и у нас во второй таблице есть миллион записей для этой статьи.
И теперь есть задача удалить эту статью. По сколько у нас ключ CASCADE, весь этот миллион записей так-же должен удалиться.
А действительно MySql знает свое дело и прямо сразу все удалит ? А если таблиц несколько ? Тоесть к статье принадлежат если лайки, комментарии, рейтинг и тп.
Тость если есть штук 20 крупный статеек, с такими хорошими связями, мы их удаляем и теперь MySql сервер должен за нас выборлить огромную часть работы по удалению связанных записей из других таблиц.
Как вообще это отработает ? или лучше не доверять и прогнать удаление циклом самостоятельно ?
Denormalization: там еще до какой-то версии вроде до 5.6, был баг. Что когда удаляешь записи все остальное остается, до нового любого запроса. + штамповать миллионы записей, можно день убить. Проще и оптимальнее уточнить у тех, кто уже проверял.
Denormalization: посмотрим что ответят. Версии везде разные. 30 строчек кода ? прикалываешься ? там вон игры в 1 строку пишут, а ты хочешь что бы я 30 строчек писал ?
Вам что вообще нужно - выяснить, гарантирует ли MySQL каскадное удаление или то, как он это будет делать? Просто такой вопрос можно о любом софте задать. Можно ли доверять ядру ОС и драйверам файловой системы в записи данных на диск?
Если вас беспокоит производительность - так и напишите, если вас беспокоит поддержка мускулом SQL как стандарта - это другое, если вы не понимаете, что гарантирует сам стандарт и что означают указанные кейворды - это третье.
В любом случае - индексы помогут MySQL все "выборлить".
nepster09 то, что записи будут удалены - это гарантировано, ограничения внешних ключей просто так не игнорируются. Я думаю, при стандартных настройках mysql неотработка имеющихся constraint-ов считается критическим багом и просто так, думаю, не случится.
nepster09 ну допустим, так вот, с точки зрения изоляции вам вообще зачем знать мгновенно он это сделает или нет? Я не знаю, какие у mysql дефолтовые настройки, но при самом высоком уровне изоляции у вас параллельные транзакции либо увидят все 1М записей живыми, либо их всех уже не будет. Сколько там MySQL их будет удалять физически - это уже в общем-то не проблема клиента. Конечно, если сервер в принципе не будет справляться с удалением (изза 100% загруженности диска/проца) - это другой вопрос, но я думаю вы не каждую секунду будете удалять миллион записей. В больших СУБД типа mssql или оракла физическая запись изменений - это вообще отдельная история. Изменения могут накапливаться в логе и скидываться на диск относительно редко большими порциями, там вообще нет понятия "мгновенно".
Станислав Макаров: я понял, больше спасибо. Мгновенно я имел ввиду для себя. Тоесть я вижу что они удалены из таблицы, а то что они где-то там в очереди на удаление, это не мои проблемы.
nepster09 да, именно так, если вашу транзакцию сервер успешно выполнил, записей уже не будет, либо если по каким-то причинам он этого не сделал, наоборот, все записи будут на месте. Возможно выполнение транзакции займет какое-то заметное время, но вы не сможете выполнять другие запросы, пока не завершится текущая транзакция с удалением записей.
Вы уже достаточное количество раз спросили "вы уверены?", чтобы а) основательно почитать документацию; б) задуматься об использовании другой СУБД помимо mysql, если нужны какие-то более серьезные гарантии (mysql это все-таки не для финансов и не для критичных приложений, чего уж там); в) установить и попробовать самому. Можете начать изучение отсюда: https://dev.mysql.com/doc/refman/5.6/en/set-transa... Заодно разберетесь с уровнями изоляции, т.к. это по сути и есть ответы на ваши вопросы - разные уровни дают разные гарантии ценой разной производительности параллельных транзакций.