Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
MySQL

Одна таблица vs много таблиц (производительность)

04.05.2023, 12:37. Показов 1024. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Понятно что чем меньше таблиц в phpMyAdmin тем легче и быстрее понять БД.
Но что при этом происходит с производительностью.
Например;
На сайте проходят соревнования участников, есть 2 варианта как сохранить каждое соревнование - под каждое соревнование отдельную таблицу (что скорее всего все возненавидят), или одну таблицу для всех соревнований с дополнительным полем идентификатора соревнования.
Если у нас на сайте 1000 соревнований и в каждом по 400 участников ( в среднем) , то в первом случае мы получаем 1000 таблиц, а во втором одну таблицу на 400000 записей.
И вот вопрос;
Нужно из пятого соревнования вытащить тех у частников у которых вес от 50кг до 55 и возраст 30-35 лет.
В первом случае ьы берем SELECT из пятой таблицы, а во втором из общей таблицы WHERE `idEvent` = 5.
В каком случае будет быстрее?
А если нужно периодически переписывать соревнование (новый участники), то в первом случае достаточно просто очистить пятую таблицу и закинуть туда все новые данные , а во втором удалить все записи из общей таблицы (WHERE `idEvent` = 5) и закинуть новые.
И тоже не ясно на сколько в общей таблице это будет медленнее?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.05.2023, 12:37
Ответы с готовыми решениями:

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

Одна форма много таблиц EF
Добрый день! Подскажите пожалуйста. Есть одна форма, основная задача этой формы - показать ту или иную таблицу в DGV и редактирование...

Много таблиц или одна с пустыми значениями
Проектирую базу на MySQL. Есть основная таблица с пользователями. Пользователи делятся на типы и у каждого типа разный набор свойств. Я...

11
Супер-модератор
Эксперт JSЭксперт HTML/CSSЭксперт PHP
 Аватар для gogolik
3971 / 2093 / 832
Регистрация: 13.03.2010
Сообщений: 6,916
04.05.2023, 12:43
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
А если нужно периодически переписывать соревнование (новый участники), то в первом случае достаточно просто очистить пятую таблицу и закинуть туда все новые данные
Что за дичь?

У вас должна быть:
- таблица с участниками;
- таблица с соревнованиями;
- таблица, которая связывает участников и соревнования.
Всё это связать между собой внешними ключами. И не нужно изобретать велосипед на 1000 таблиц.
0
1315 / 1007 / 232
Регистрация: 01.10.2018
Сообщений: 3,911
04.05.2023, 13:44
Если характеристики соревнований примерно одинаковые, то одна таблица. Если есть соревнования двух совершенно разных видов, то можно использовать две таблицы.

Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
Если у нас на сайте 1000 соревнований и в каждом по 400 участников ( в среднем) , то в первом случае мы получаем 1000 таблиц, а во втором одну таблицу на 400000 записей.
Это не таблица соревнований. Размер (количество записей) таблицы соревнований не зависит от количества участников соревнований. Он зависит от количества соревнований.
0
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
04.05.2023, 15:19  [ТС]
Вопрос не в том как решить эту задачу, а когда выше производительность - когда запросы работают с одной из 1000 таблиц, или когда все эти "1000 таблиц" находятся в одной и в неё через sql запрос нужно обработать эти данные.
Все равно же когда мы обращаемся к таблице с условием WHERE `idEvent` = 5 - на эту выборку записей тратится времени больше чем на SELECT без WHERE. И чем больше записей в таблице, тем медленнее должен работать SELECT вместе с WHERE.
А когда мы берем все данные из одной маленькой таблицы на 400 записей (а не из большой общей на 400000 записей) - то WHERE не нужен и получить все данные из этой таблицы мы должны быстрее чем из общей. Но другой вопрос на сколько быстрее.
Как сильно зависит производительность выборки от числа записей в таблице (и не только выборки но и перезаписи и других sql действий - SELECT, INSERT...) ?
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
04.05.2023, 15:39
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
Все равно же когда мы обращаемся к таблице с условием WHERE `idEvent` = 5 - на эту выборку записей тратится времени больше чем на SELECT без WHERE.
Это с чего ты взял? Если по полю idEvent есть индекс, то запрос отрабатывает быстро. А без WHERE по любому будет full scan
0
1315 / 1007 / 232
Регистрация: 01.10.2018
Сообщений: 3,911
04.05.2023, 15:48
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
Все равно же когда мы обращаемся к таблице с условием WHERE `idEvent` = 5 - на эту выборку записей тратится времени больше чем на SELECT без WHERE.
А затраты на поиск таблицы, когда используется огромное количество таблиц?
0
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
04.05.2023, 16:45  [ТС]
Цитата Сообщение от estic Посмотреть сообщение
А затраты на поиск таблицы, когда используется огромное количество таблиц?
Дак вот в том то и вопрос, на что больше время тратится - на поиск таблицы ( SELECT * FROM table_5 ) или на поиск записей из общей таблицы ( SELECT * FROM commontable WHERE `idEvent` = '5' ) ?
Есть ли какая то инфа по этому вопросу, кто ни будь делал тесты?
0
1315 / 1007 / 232
Регистрация: 01.10.2018
Сообщений: 3,911
04.05.2023, 16:56
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
Дак вот в том то и вопрос, на что больше время тратится
Ну, проверьте сами и расскажите. Я пока не выжил из ума, чтобы генерировать тысячу однотипных таблиц
0
Эксперт PHP
3900 / 3238 / 1353
Регистрация: 01.08.2012
Сообщений: 10,914
04.05.2023, 20:11
nnnikotinnn995, рекомендую посмотреть в сторону партицирования. СУБД сама внутри себя разделит одну таблицу на множество частей (партиций) по выбранным вами критериям.
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
05.05.2023, 12:48
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
SELECT * FROM table_5
Т.е. если у тебя 1000 таблиц, ты напишешь 1000 SELECT ? А как разобраться, когда какой SELECT использовать?
Что касаемо производительности. В составе документации по Oracle есть том Performance Tuning Guide. Наверняка по MySQL есть что-то аналогичное
0
1315 / 1007 / 232
Регистрация: 01.10.2018
Сообщений: 3,911
05.05.2023, 14:01
Цитата Сообщение от Grossmeister Посмотреть сообщение
А как разобраться, когда какой SELECT использовать?
Предварительная фильтрация (точнее проверка существования) по таблице соревнований обычно в любом случае присутствует. Т.е. при предварительном запросе можно получать как числовой id соревнования, так и символьный, по которому можно "вычислить" имя таблицы, или готовое имя таблицы. Также имя таблицы можно "вычислять" по числовому id, объединяя какой-то префикс с числовым id.

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

Добавлено через 1 минуту
А вот, отталкиваясь от "участника", искать его "участие" будет действительно интересно
0
 Аватар для Дух системы
75 / 58 / 20
Регистрация: 01.10.2009
Сообщений: 208
11.05.2023, 10:57
если это разовая ситуация на 400тыс, то можно хранить и в одной таблице
если это регулярно пополняемая, например раз в год, то имеет смысл бить их по годам/месяцам и тп

как я это вижу
таблица `участники` (`id`,`фио`,`дата рождения`,`пол`,`доп информация`)
таблица `виды_соревнований` (`id`,`название`)
таблица `связи_2023` (`id`,`id_участника`,`id_вида_соревнован ия`,`вес_участника в integer`,`результат`)

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//входящие данные
$_year=2023;
$_evid=5;
$_start_bday=$_year-35;//возраст для примера, можно заморочиться с датой проведения соревнования и от неё уже считать возраст (лень)
$_end_bday=$_year-30;
$q=mysqli_query($link,'SELECT * FROM `виды_соревнований` WHERE `id` >= "'.$_evid.'";');
if(mysqli_num_rows($q) > 0)
{
    while($r=mysqli_fetch_array($q))
    {
        ${'evname'.$r['id']}=$r['название'];
    }
}
$q=mysqli_query($link,'SELECT * FROM `участники` WHERE `дата рождения` >= "'.$_start_bday.'0101" AND `дата рождения` <= "'.$_end_bday.'0101";');//берем всех участников с датой рождения. можно и без неё, но внутри while проверять на возраст, тут скорость от сервера зависит
if(mysqli_num_rows($q) > 0)
{
    while($r=mysqli_fetch_array($q))
    {
        //if($r['дата рождения'] >= $_start_bday.'0101' AND $r['дата рождения'] <= $_end_bday.'0101')
        //{
            ${'usr'.$r['id']}=['fio'=>$r['fio'],'bday'=>$r['bday']];
        //}
    }
    $out=[];
    $q=mysqli_query($link,'SELECT * FROM `связи_2023` WHERE `id_вида_соревнования` >= "'.$_evid.'";');
    if(mysqli_num_rows($q) > 0)
    {
        while($r=mysqli_fetch_array($q))
        {
            if(isset(${'usr'.$r['id_участника']}))//был ли участник из запроса выше
            {
                $out[]=${'usr'.$r['id_участника']}['fio'].' '.$r['результат'].'<br>';//в переменную вывода, тк формировать output внутри цикла такое себе
            }
        }
        
    }
    echo ${'evname'.$evid}.'<br>';
    echo implode('<br>',$out);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.05.2023, 10:57
Помогаю со студенческими работами здесь

Много ящиков - одна БД ?
Есть сервер у которого несколько доменных имен (name1.com; name2.com....) . Как сделать чтобы почта на ящик info@name2.com складывалась в...

Одна переменная много проверок
Здравствуйте. У меня очень нубский вопрос. Можно ли как- то написать так чтобы не было нужно писать в каждой проверке одну и ту же...

Много пользователей - одна модель
Уважаемые специалисты, Только недавно начал изучать MVC - Вопрос скорее всего очень примитивный. Попытаюсь его сформулировать....

Одна схема - много пользователей
Здравствуйте, существует база данных, в ней схемы. Возникла ситуация, что есть несколько пользователей, которые должны работать в одной...

Не создаются много кнопок, а лишь одна
Хотел сделать Морской бой, решил, что можно реализовать с помощью кнопок и вот хочу создать много кнопок, но выводится лишь одна....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru