Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
 Аватар для nnnikotinnn995
7 / 7 / 4
Регистрация: 07.07.2011
Сообщений: 583
MySQL

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

04.05.2023, 12:37. Показов 979. Ответов 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
3941 / 2045 / 829
Регистрация: 13.03.2010
Сообщений: 6,727
04.05.2023, 12:43
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
А если нужно периодически переписывать соревнование (новый участники), то в первом случае достаточно просто очистить пятую таблицу и закинуть туда все новые данные
Что за дичь?

У вас должна быть:
- таблица с участниками;
- таблица с соревнованиями;
- таблица, которая связывает участников и соревнования.
Всё это связать между собой внешними ключами. И не нужно изобретать велосипед на 1000 таблиц.
0
1304 / 996 / 232
Регистрация: 01.10.2018
Сообщений: 3,870
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
1304 / 996 / 232
Регистрация: 01.10.2018
Сообщений: 3,870
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
1304 / 996 / 232
Регистрация: 01.10.2018
Сообщений: 3,870
04.05.2023, 16:56
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
Дак вот в том то и вопрос, на что больше время тратится
Ну, проверьте сами и расскажите. Я пока не выжил из ума, чтобы генерировать тысячу однотипных таблиц
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
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
1304 / 996 / 232
Регистрация: 01.10.2018
Сообщений: 3,870
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru