Могу ли я ВСТАВИТЬ в таблицу, ОБНОВЛЯЯ несколько разных строк с MariaDB или MySQL? - PullRequest
0 голосов
/ 12 апреля 2019

Я создаю собственную аналитическую систему и в настоящее время в процессе проектирования базы данных.Я планирую использовать MariaDB с движком InnoDB для обработки больших нагрузок.

Ожидаемые данные могут составлять около 500 тыс. Кликов в день.Мне нужно будет вставить эти строки в базу данных, а это значит, что в среднем у меня будет около 5,8 вставок в секунду.Однако в то же время я хочу записать, посетил ли кто-то страницу, связанную с этим кликом.(в основном для записи воронок)

Итак, я планирую создать дополнительные столбцы и найти идентификатор конкретной строки, а затем обновить этот столбец, указав точное время посещения.

Мой первый вопрос: это вообще рекомендуемый подход для проектирования базы данных подобным образом?Если нет, то как еще стоит проектировать базу данных?

Меня беспокоит только то, что при обновлении строк таблица будет заблокирована и не сможет выполнять вставки, что замедляет работу пользователя.

Мой второй вопрос: Стоит ли мне беспокоиться о том, что таблица блокируется при обновлении и, таким образом, замедляет вставки?Вредит ли это производительности?

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

InnoDB не блокирует таблицу для вставки, если вы выполняете обновление.У ваших пользователей не будет никаких странных зависаний.

Это MVCC-совместимый движок , предназначенный для одновременного доступа к базовым таблицам.

Вы можете управлять поведением движка,выбирая соответствующий уровень изоляции , однако значение по умолчанию (REPEATABLE READ) отлично и делает работу более чем хорошо.

Если таблица изменяется несколькими пользователями (не пользователями, которые подключаются)на ваш сайт, но соединения установлены с MySQL через язык сценариев или какой-либо другой сервис), и есть много операций вставки / обновления / удаления - MySQL может выдать ошибку, сообщив, что произошла взаимоблокировка.

Дедлок - это предупреждение, а неошибка, что более 1 потока пытались получить доступ к занятому ресурсу (например, два потока пытались обновить одну и ту же строку одновременно, но только 1 будет разрешено это делать).Это указание на то, что вам следует повторить запрос.

Я предлагаю вам позаботиться о всех возможных сценариях на языке по вашему выбору, когда речь идет об обработке MySQL, которая находится под более интенсивным вводом / выводом.

~ 6 вставок в секунду - это не много, убедитесь, что вы разрешаете MySQL доступ к достаточным системным ресурсам.Для InnoDB, проверьте значение innodb_buffer_pool_size или немного погуглите, чтобы узнать, что это такое и как использовать его, чтобы ваша база данных работала быстро.

Удачи!

1 голос
/ 13 мая 2019

Всего за 5,6 / сек проблем не будет много.

Тем не менее, я предлагаю вертикальное разбиение для "Likes", "Upvotes", "Clicks" и подобных вещей. Как правило, в них бывает UPDATEs случайных отдельных строк, и может мешать другой деятельности.

То есть иметь отдельную таблицу с (возможно) всего 2 столбцами:

  • Идентификатор понравившегося элемента / клика / и т. Д.
  • Счетчик.

Это достаточно просто (и достаточно быстро), чтобы JOIN через это id, когда вы хотите отобразить информацию, включая счетчик.

Как уже указывалось, строка заблокирована, а не таблица .

...