MySQL « Использование внешних ключей в InnoDB в высоконагруженых проэктах.

При проєктировании базы данных использую InnoDB и внешние ключи, но кажеться где-то слышал,что ключи замедляют работу базы, так ли это? Будущее приложение критично к скорости по этому хочу уточнить данный момент, использовать ключи или лучше сохранять целосность данных на уровне php?

1 ответов


В общем случае да, ключи являются констрейнтом. Т.е. условием, которое СУБД проверяет при каждой вставке. Более тяжелым, чем условия NOT NULL и другие.

Но как вы будете проверять целостность на php? Перед инсертом делать селекты по всем зависимым таблицам (обязательно в той же транзакции!) и выяснять, есть ли в них ID записи, который хотите вставить? В этом случае производительность точно просядет. Это в разы медленнее (СУБД делает то же самое, но более оптимальным способом) и трудоемко в реализации (на каждый insert писать кучу select-ов).

Если предполагаете поступить так:
1. Пользователь открывает какую-то страницу.
2. При построении страницы делается select из базы.
3. Пользователь в открывшейсе странице что-то делает, сохраняет.
4. php формирует запрос, делается insert в базу.
то в этом случае php никакой целостности гарантировать не может. Между моментом получения данных и их сохранением прошло какое-то время. За этот промежуток времени данные в базе могли измениться. И то что было верно на шаге 2, становится ошибочным на шаге 4.