Ответы пользователя по тегу Базы данных
  • Как написать SQL запрос?

    Melkij
    @Melkij
    PostgreSQL DBA
    Errcode 28 = нет места на диске. (или инодов)

    Не очень понял, зачем вам concat понадобился.
    SELECT
      COUNT(DISTINCT `offer`) AS `cnt`,
      `webmaster`, `partner`
    FROM `orders`
    GROUP BY `webmaster`, `partner`
    HAVING `cnt` > 1
    Ответ написан
    Комментировать
  • Как узнать почему MySQL нагружает процессор?

    Melkij
    @Melkij
    PostgreSQL DBA
    В slow log куча запросов без индексов

    MySQL нагружает процессор

    Собственно.

    С консоли - запускайте через SELECT SQL_NO_CACHE. Скорей всего у вас query cache активен.
    Ответ написан
  • Как написать запрос?

    Melkij
    @Melkij
    PostgreSQL DBA
    Никак.
    Глупый mysql не умеет рекурсивные запросы.

    на выбор:
    - меняете структуру хранения. nested sets или материализованный путь, например
    - вытягиваете всё на приложение и строите там
    - делаете МНОГО запросов
    - пишете хранимку, которая будет делать много запросов
    - если вложенность известна - то через n джойнов можно.
    Ответ написан
    2 комментария
  • Как в БД подставлять старые значения справочников?

    Melkij
    @Melkij
    PostgreSQL DBA
    Для начала между работником и учебным заведением связь многие-ко-многим.
    Во-вторых, с чего это для новых работников выбираются только новые значения? Можно быть одновременно новым работником и закончить лет *дцать назад именно бывшее тогда учебное заведение. Выбирать можно из всего списка, либо, что лучше, хранить для учебного заведения год открытия и год закрытия (default null) и выбирать подходящие по годам обучения.
    Если сохраняете ещё и даты обучения - то важно учесть, что учебное заведение может быть закрыто в любой момент между поступлением и выпуском студента. Поступил в одно заведение, выпустился из другого - запросто.

    Если нет особых требований к поиску учебных заведений, то достаточно хранить год закрытия (default null) и ссылку на новую форму после реорганизации, если есть (поэтому тоже default null).
    Для вашего примера будет КГПА например с edu_id = 105, reorg_to_id null и КГПУ со своим edu_id, датой закрытия и reorg_to_id = 105
    Ответ написан
    Комментировать
  • Как обработать коды ошибок PDO?

    Melkij
    @Melkij
    PostgreSQL DBA
    Переключите PDO::ATTR_ERRMODE в единственный адекватный режим PDO::ERRMODE_EXCEPTION.
    Нормальный поток исполнения - вас не заботят ошибки в SQL, раз метод вернул управление, значит он был выполнен успешно.
    Случилась какая-то ошибка - словили исключение. Если для какой-то конкретной ошибки вам нужна своя реакция - то тогда уже выясняете код именно этой ошибки, смотрите в getCode и реагируете на конкретный код ошибки.
    Ответ написан
    1 комментарий
  • Как можно максимально ускорить выборку с низкой селективностью из таблицы с сотнями миллионов записей?

    Melkij
    @Melkij
    PostgreSQL DBA
    Какие индексы есть? Структура таблицы?
    explain (analyze, buffers)?

    1. не нужно
    2. см. 1
    3. если вы упираетесь в CPU, а не в диск. Если в диск - сделает только хуже.
    4. сначала выяснить, как ведёт себя имеющаяся табличка. Потом думать. Например, brin по id города. На низкоселективных полях получится внятный компактный индекс.
    5. 200гб вполне себе нормальная база. Даже не астрономически дорого целиком в shared_buffers разместить.
    Ответ написан
  • Как увеличить скорость скрипта работающего с БД?

    Melkij
    @Melkij
    PostgreSQL DBA
    Возьмите профилировщик и посмотрите, на чём именно теряете время.

    О каком классе СУБД вообще речь?
    Например, если речь о транзакционной РСУБД, строки объёмные, то можно сделать так:
    create temporary table updatetable(guid uuid not null)
    пачками этак по 1000 guid вычитываете guid'ы из источника и записываете в эту временную табличку.
    select guid from updatetable where not exists (select 1 from normaltable where normaltable.guid = updatetable.guid)
    Так получили список guid, которых в целевой БД нет. Сходили в источник за полной версией всех данных этих guid, пачками записали в целевую БД.
    Ответ написан
  • Какие есть инструменты для отладки запросов к БД?

    Melkij
    @Melkij
    PostgreSQL DBA
    Со стороны СУБД:
    Postgresql: pg_stat_statements
    https://www.postgresql.org/docs/current/static/pgs...
    Mysql: slow query log
    dev.mysql.com/doc/refman/5.7/en/slow-query-log.html
    Для других не в курсе, ну раз даже у mysql есть хоть что-то, то и у других точно что-нибудь будет.

    Со стороны PHP - xdebug + kcachegrind точно скажет, где теряете время для конкретного запроса и как туда попали. Для мониторинга боевой системы в целом - посмотрите в сторону pinba.
    Из самого кода проекта - непосредственно библиотеки доступа к субд профилированием не занимаются. Поэтому нужно смотреть конкретный проект, есть ли там место, куда можно воткнуть профилирование запросов.
    Ответ написан
    Комментировать
  • Как правильно убить postgresql idle процессы?

    Melkij
    @Melkij
    PostgreSQL DBA
    pgbouncer держит всегда запущенными некоторый пул коннектов (дефолтно, во всяком случае, не в курсе, можно ли его попросить долговременно не держать коннекты вообще). Если вы их утилизируете не все - то будут idle.
    А так же это могут быть и старые коннекты, если инициатор соединение ещё не закрыл сам или оно ещё не было закрыто по таймауту. Например, приложение может иметь собственный пул коннектов.

    И, разумеется, pgbouncer обрабатывает только те коннекты, которые адресованы именно ему. СУБД он не трогает вовсе, pgbouncer - стороннее приложение, для postgresql - это просто ещё один клиент.
    Ответ написан
    Комментировать
  • Триггер на изменение данных?

    Melkij
    @Melkij
    PostgreSQL DBA
    Триггер не нужен, mysql умеет самостоятельно такое делать. ON UPDATE CURRENT_TIMESTAMP в объявлении колонки.
    https://dev.mysql.com/doc/refman/5.7/en/timestamp-...
    Ответ написан
    1 комментарий
  • Как правильно сформировать запрос к mysql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Mysql? Неудобно.

    select /**/ from (
        select 123321 as id
        union all
        select 154874
        union all
        select 12233
    ) as targets
    where not exists (
        select 1 from tablename where tablename.id = targets.id
    );
    Ответ написан
    Комментировать
  • Как организовать репликацию БД?

    Melkij
    @Melkij
    PostgreSQL DBA
    Т.е организовать единую точку управления этими серверами.

    Может, лучше единую точку управления и делать? ansible/salt/chef/puppet, в конфигурации понаписать инициализацию нужного состояния таблицы.

    Для реплики - минимальная гранулярность, на сколько знаю, это таблица. И только для логической репликации.
    Ответ написан
    Комментировать
  • Автоматический set в mysql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Зачем set? Таблица связей типично состоит из пары внешних ключей на связываемые таблицы. Т.е. обычно два инта и составной первичный ключ.

    Возможность есть понаписать триггер. Только сначала хотелось бы понять смысл.
    Ответ написан
    Комментировать
  • Как верно проектировать базу данных?

    Melkij
    @Melkij
    PostgreSQL DBA
    Если нужна таблица - должна быть таблица.

    Postgresql предоставляет шикарную возможность разделить базу данных на схемы. Есть пачка таблиц, описывающая какую-нибудь сущность? Перенесите их в отдельную схему и пусть не мешаются в public. Таблицы аггрегации? Выкиньте их в отдельную схему.
    Замечательно помогает, если становится многовато таблиц (несколько десятков разве много?).
    Правда, если вы любитель всякого орм, ваша библиотека может не уметь схемы.
    Ответ написан
    Комментировать
  • Какая особенность MySQL вызывает такую разницу в обработке запросов?

    Melkij
    @Melkij
    PostgreSQL DBA
    Посмотрите в explain, что планировщик думает по этим запросам. Есть большое подозрение, что хранимка и константный запрос идут по индексу по id, запрос с переменной - как-то иначе.

    Одна очевидная грабля:
    Значение переменной может изменяться во время выполнения запроса.
    Константное значение в запросе и аргумент хранимки - не могут.
    Соответственно моё предположение: глупый оптимизатор не смотрит, что в запросе переменная никак не изменяется, значит не может просто взять индекс по id и надо делать что-то другое. Скорей всего seq scan - судя по названию таблицы, данных подпадающих под условие dt <= дата куда больше, чем данных под него не попадающих. Для хорошей работы по индексу надо обратное свойство.
    Ответ написан
    3 комментария
  • Postgresql. Можно ли так отсортировать?

    Melkij
    @Melkij
    PostgreSQL DBA
    order by age = 30, name
    Может быть age = 30 DESC, я их всегда путаю
    Ответ написан
    Комментировать
  • Почему из базы MySQL самопроизвольно удаляются записи?

    Melkij
    @Melkij
    PostgreSQL DBA
    MyISAM

    баланс на моем сайте

    Сделайте мне это развидеть.

    Это безотносительно проблемы. Хранить данные и нетранзакционное хранилище - взаимоисключающие вещи. Используйте единственное транзакционное хранилище в mysql - innodb. И добавьте внешние ключи.

    Несколько маловероятно, что это непосредственная проблема, в штатном режиме даже myisam выборочно строки терять не должен так, что это заметил только конкретный пользователь. Более вероятна реакция mysql "аааа, таблица повреждена, я буду говорить только с админом". Впрочем, я давно уже не работал с myisam в продакшене, может и такое поведение тоже характерно.
    А вот FK в режиме restrict вполне поможет от странных запросов.
    Ответ написан
    Комментировать
  • Транзакции БД и запись на диск?

    Melkij
    @Melkij
    PostgreSQL DBA
    если я хочу гарантированные true транзакции то мне надо ставить только 1?

    Да.
    И надо бы учитывать что это только то, на что может повлиять СУБД - т.е. вызвать fsync. Нижележащие ОС и железо могут не осуществлять реальную запись данных при ответе на fsync. Обычно fsync честный, но это стоит проверять или в документации (к рейд-контроллеру, например) или у гугла или синтетикой (результаты бенчмарков на разных innodb_flush_log_at_trx_commit должны различаться существенно)

    Значения 0 и 2 - данные о коммите транзакции в WAL могут не успеть записаться на диск и при восстановлении базы эти транзакции будут отменены. Ведь если в WAL нет данных о коммите - как СУБД понять, была транзакция закоммичена или авария случилась ещё до коммита и транзакция была прервана?
    Ответ написан
    Комментировать
  • Как правильно выполнить выборку?

    Melkij
    @Melkij
    PostgreSQL DBA
    select st.name, count(0) from Sms join Sms_status st on status_id = st.id where st.name in ('sent','not_sent', 'new') group by status_id

    Аналогично и первая толпа запросов сворачивается в один простой SQL.

    А с учётом сущности данных - имеет смысл их перенести в отдельную таблицу аггрегации и не пересчитывать в рантайме весь массив.
    Ответ написан
  • Имеет ли смысл использовать SMALLINT вместо INT (PostgreSQL)?

    Melkij
    @Melkij
    PostgreSQL DBA
    int всегда 4 байта, smallint всегда 2 байта.
    Меньше байт занимают данные - значит в тот же объём памяти на железке войдёт больше данных, и меньше данных надо будет прогонять через диски. Меньше работы дискам - это всегда плюс в производительности СУБД.
    При том, данные меньше занимают места и в таблицах и в индексах.

    Но это если у вас порядком целочисленных данных, а не какие-нибудь считанные миллионны строк. Что такое экономия десятка мегабайт данных на машинке с несколькими десятками гигабайт памяти?
    Иначе использование подходящих типов это вежливость, проявление профессионализма и лишний способ случайно не отстрелить себе ногу (по ошибке записать что-то совсем странное уже не получится).
    Ответ написан
    Комментировать