Производительность БД с одной и многими таблицами. Мини-тест
В прошлом посте обмолвился, что собираюсь в своей базе данных завести каждому пользователю по табличке. Ну потому что у меня запросы всегда только для одного пользователя, а значит можно сэкономить ресурсы сервера на индексации, так я думал. Мне накидали полную панамку что так делать нельзя, но почему – никто особо не объяснил. И я решил бахнуть небольшой тест на нескольких БД – проверить что там будет на самом деле.
Для ЛЛ: В большинстве случаев выдавать каждому пользователю по таблице действительно нет смысла. Но для SQLite запросы обрабатываются ощутимо быстрее, если у каждого пользователя своя табличка.
Итак, тестовая задача, более- менее приближенная к моему сценарию:
периодически пользователи закидываеют в БД записи в которой есть ID пользоватея, время записи, текстовая метка (комментарий) и какой-то параметр (число)
INSERT INTO mega_table (id, dt, txt, dat_stat) VALUES ( %s, %s, %s, %s )
после наполнения базы пользователями иногда запрашивается статистика по тому самому числовому параметру за какой-то период времени и с определенным комментарием
SELECT SUM( dat_stat ) FROM mega_table WHERE id=%s AND dt < %s AND dt > %s AND txt = %s
Проверял 3 БД: MySQL сдвижками InnoDB и MyISAM, SQLite и Postgres. Написал скрипт, который эмулирует заполнение БД и запросы к ней, и измеряет сколько времени занимает добавление записи и выполнение запроса. Скачать скриптец можно тут (он сугубо тестовый, т.е. стрёмный и без никакой обработки ошибок, уж сорян). Менял количество пользователей и количество записей у каждого пользователя и смотрел что будет если всё писать в одну таблицу, либо каждому пользователю создавать отдельную. Заодно после выполнения скрипта посмотрел сколько полученные базы данных занимают места на диске.
И вот получились такие таблички.
Какие выводы я для себя сделал.
Во первых видно, что если делать по таблице для каждого пользователя, то и добавление записи, и обработка запроса и размер БД получаются вобщем не лучше, чем если завести одну таблицу на всех. Единственное исключение – выполнение запросов в SQLite (и в некоторых случаях для Postgre) может быть в разы быстрее на многих таблицах, чем на одной. Почему так получается? Думаю потому что БД люто заоптимизированы очень крутыми чуваками под определенные сценарии использования. И если ты не столь-же крут (я лично нет), то нужно выбрать наиболее подходящую БД и подгонять свою задачу под типичные сценарии использования этой БД.
Во вторых если мне важнее скорость добавления/чтения (т.е. экономить вычислительные ресурсы) то из протестированных лучше пользовать Postgres, если важнее экономить место на диске – то MySQL с движком MyISAM. MySQL с движком InnoDB где-то посередине.
В третьих SQLite неожиданно всех обошел в скорости выполнения запросов (для моего случая по крайней мере). Прикольно.
Ну и в четвертых, питоновская обёртка для SQL-запросов про которую я писал в прошлом посте таки упростила бы мне написание тестового скрипта, но для чистоты эксперимента пришлось её отложить в сторону.
В любом случае это было интересно сделать, надеюсь кому-то было интересно и почитать.
Новости из мастерской #17. Ищем форму. Опять
Всем привет!
Есть у меня такая черта, что я буду упираться, мучиться, тратить время и материалы до тех пор, пока не добьюсь той самой формы, которая будет нравиться лично мне. Уж простите, заказчики.) И тут не помогут никакие эскизы или советы от других мастеров, здесь работает какая-то другая система, которую я не понимаю и не могу контролировать. Что-то на интуитивном уровне. Я просто делаю и делаю, ищу форму до тех пор, пока не увижу, что попал в точку.
Я тут посчитал, что прежде чем я сделал тот самый чайник в проекте "LV-426", я слепил и продал или подарил около тридцати чайников.
Кажется настала пора искать форму для новой серии. Это только второй шаг.
Купил лицуху Atomic Heart, но не судьба поиграть...
Короче принимайте в лигу тупых))) купил через xbox данную игрушку ПК версии, установил всё по инструкции всё необходимые приложения, и вошёл в свои учётки микрософт стор ,а вот хбокс никак не хотела программа мне дать войти в ЛК, появлялся черный экран и в трей сворачивалась ((( нашёл решение в инете, надо было в службах вкл что касается хбокс автоматический режим, вроде получилось зайти, увидел свою покупку ура!!! купил пивка снэков смазку и мечтал уже увидеть близняшек, но опять проблема!!! Нажимаю скачать игру, а хбокс приложение выдает ошибку 0x800700e9, сука!!! Всё что есть в интернете способы перепробовал,и регион менял, и время региона, нечего не помогает...
АХ да забыл сказать что я чайник в компьютере!!!
Весь день убил, на решение проблемы, снёс систему 10ку, установил 11, потратил денег на ключи, думал проблема в пиратской копии виндовс, но нет((( всё тоже самое((( короче психанул, снёс все и жду Пиратскую копию игры, разрабы без обид я пытался.
P.S. пивасик выпил, снэки съел, смазку на жену потратил))) Простите за ошибки!!!
Поиграем в бизнесменов?
Одна вакансия, два кандидата. Сможете выбрать лучшего? И так пять раз.