Size: a a a

2020 June 17

А

Александр in ru_mysql
Mb1W@
В целом замедляется  INSERT/UPDATE/DELETE на таблице с внешними ключами:
The performance of updating is more, because for each foreign key, an INSERT/UPDATE/DELETE has to check to see if the constraint is satisfied. That means a primary key lookup to the referenced tables. This impact is measurable, and it is greater if the referenced tables are not in the buffer pool.

По этой причине я стараюсь их не использовать без реальной необходимости.
не знаю насколько сильно замедляется в мускуле, но в Oracle Том Кайт тестировал и там было микроскопическое замедление, поэтому настоятельно советовал всегда их использовать чтобы БД не превратилась в тыкву
источник

А

Александр in ru_mysql
могу найти выдержку из книги
источник

А

Александр in ru_mysql
источник

А

Александр in ru_mysql
оказывается не микроскопическое, а 10-15%
"На основании этого можно сделать вывод, что ссылочная целостность в базе данных добавляет от 10% до 15% издержек. Это невысокая плата за то, чтобы спокойно спать по ночам, зная, что целостность данных защищена и что был использован самый быстрый способ разработки приложения. И не имеет значения, какое новое приложение будет добавлено в систему, поскольку, столкнувшись с этим правилом, оно не сможет его нарушить. Этот же принцип работает и в больших масштабах."
источник

А

Александр in ru_mysql
в любом случае это очень мало и ВК не стоит пренебрегать, т.к. зачастую в приложении есть гораздо больше резервов для повышения производительности
источник

NI

Nickolay Ihalainen in ru_mysql
если в базе FK, значит создателя схемы не интересовала производительность.
источник

NI

Nickolay Ihalainen in ru_mysql
FK - всё ради правильности данных, любой ценой.
источник

А

Александр in ru_mysql
цена минимальна
источник

А

Александр in ru_mysql
приложение с неправильными данными можно смело на помойку относить
источник

NI

Nickolay Ihalainen in ru_mysql
блокировки, вместо одной таблички обращаемся к нескольким за один запрос, так двух миллионов запросов в секунду не добыть с одного сервера. Я не критикую подход проверок консистентности, на таких базах редко можно увидеть что-то быстрее 10-20 тыс запросов в секунду. Для денег - важно, для K-V дорого.
источник

А

Александр in ru_mysql
ну когда надо грузить миллионы строк с секунду это скорее исключительный и один из случаев использования БД, тут наверное можно и отключить для вставки данных.... но потом то всё равно придётся данные проверять.... так что то на то...
источник

А

Александр in ru_mysql
притом отключить желательно только для этого процесса через FOREIGN_KEY_CHECKS=0
источник

🇻

🇻 🇱 🇦 🇩 in ru_mysql
Александр
притом отключить желательно только для этого процесса через FOREIGN_KEY_CHECKS=0
не могу сходу придумать сценарий в котором приходися писать милион строк в секунду
источник

🇻

🇻 🇱 🇦 🇩 in ru_mysql
в одну базу
источник

А

Александр in ru_mysql
вот и я про то же
источник

А

Александр in ru_mysql
в реальных приложениях любые чеки исключительно полезны и всех проще они реализуются на уровне БД
источник

NI

Nickolay Ihalainen in ru_mysql
миллионы запросов в секунду, это про чтение, на запись это сотни тысяч. Сценарий как у facebook - почти все запросы на чтения идут в memcached, в mysql попадают только запросы на запись (на большой процент), FK в rocksdb они даже не стали реализовывать.
источник

NI

Nickolay Ihalainen in ru_mysql
и FK получается совсем не web-scale, особенно неясно что делать с шардированными базами.
источник

🇻

🇻 🇱 🇦 🇩 in ru_mysql
Nickolay Ihalainen
и FK получается совсем не web-scale, особенно неясно что делать с шардированными базами.
если данных больше чем buffer pool, в буффер пуле я так понимаю в первую очередь хранятся индексы и горячие данные. а дерево pk хранятся в ram?
источник

NI

Nickolay Ihalainen in ru_mysql
нет, innodb знает про clustered index (PK), secondary indexes (всё кроме PK) это такая же штука, как и PK с точки зрения буферпула всё одинаковое: просто страницы на 16KB (или как задать при создании базы). Когда страничка редко используется её вымывает page cleaner из буферпула и не важно PK это или не PK. Итого, если база больше чем буферпул, но меняем мы только те странички, которые помещаются в буферпул, то FK не сделают больше IO (они тоже будут закешированы).
источник