Блокировки таблиц MySQL

Меня попросили сделать несколько PHP-скриптов в базе данных MySQL, чтобы показать некоторые данные, когда я заметил, что у них странный дизайн. Они хотят провести исследование, для которого потребуется собрать до 2000 записей на каждого пользователя, и они автоматически создают новую таблицу для каждого регистрирующегося пользователя. На данном этапе это экспериментальное исследование, поэтому у них есть около 30 таблиц, но для реального исследования у них должно быть 3000 пользователей.

Я хотел предложить собрать их все в одной таблице, но, поскольку в течение периода исследования в эту базу данных может быть около 1500 INSERT в минуту, я хотел сначала задать этот вопрос здесь. Приведет ли это к блокировке таблиц в MySQL? Итак, это одна таблица с 1500 INSERT в минуту и ​​максимальным размером 6 000 000 записей или 3000 таблиц с 30 INSERT в минуту и ​​максимальным размером 2000 записей. Я хотел бы предложить первый вариант, но я хочу быть уверен, что это не вызовет никаких проблем. Я читал, что InnoDB имеет блокировки на уровне строк. Итак, будет ли это иметь лучшую производительность в сочетании с вариантом с одним столом?


person MTI    schedule 13.09.2012    source источник
comment
Переверните вопрос и спросите, зачем кому-то создавать несколько таблиц для хранения одних и тех же данных? Очевидно, дисковый ввод-вывод, индексация и т. д. будут такими же. Я предполагаю, что либо они думали, что это единственный способ обойти блокировку таблицы в myisam, либо они действительно понятия не имели, что делали. Переверните его на innodb и не оглядывайтесь назад.   -  person Alain Collins    schedule 13.09.2012


Ответы (1)


Это огромный загруженный вопрос. По моему опыту, производительность не очень точно измеряется только размером таблицы. Это сводится к дизайну. Есть ли у вас первичные ключи и индексы? Он переиндексирован? При этом я также обнаружил, что почти всегда одно обращение к БД выполняется быстрее, чем десятки. Насколько велика одна таблица (столбцы)? Какие данные вы сохраняете (больше 4000 КБ?). Возможно, вам нужно создать несколько прототипов, чтобы увидеть, что лучше всего подходит для вас. Максимум, что я могу порекомендовать, это тщательно оценить размер собираемых данных и распределить их соответствующим образом, создать индексы (но не слишком много, не переиндексировать) и протестировать.

person northpole    schedule 13.09.2012
comment
Каждая таблица имеет 4 столбца, и каждая строка должна иметь не более 400 байтов, что представляет собой смесь текстовых полей и даты и времени. Учитывая, что у них 48 ГБ оперативной памяти, 2 x 6-ядерных процессора Xeon и 6 жестких дисков в конфигурации RAID10, я думаю, что одна таблица с 6 миллионами записей будет работать хорошо. Верно? Я также могу попросить их ограничить свои INSERT одной операцией в минуту с 30 записями, потому что это максимум, который может быть сгенерирован пользователем в минуту (собирая вставленные слова). Это поможет? - person MTI; 14.09.2012
comment
Выполнение одной крупной операции будет лучше, чем выполнение 30 мелких. Тем не менее, я ненавижу заставлять людей, занимающихся продуктом, менять что-то со своей стороны из-за технических проблем; Я бы предпочел решить техническую проблему, когда это возможно/осуществимо. Похоже, вы на правильном пути. - person Alain Collins; 14.09.2012
comment
Спасибо. Я обсудил с ними перепроектирование их БД и сбора данных, и они это сделают. - person MTI; 15.09.2012