Задать вопрос
  • Как верно проектировать базу данных?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Если нужна таблица - должна быть таблица.

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

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Вторичные индексы InnoDB, как известно, ссылаются на значение первичного ключа, а физически на дисках данные лежат рядом с первичным ключом и отсортированы по по этому самому первичному ключу. Значит, если в индексе написано, что вам нужны id 9, 6, 50, 8 и 7, выгоднее их читать с диска не в таком порядке, а пересортировать и прочитать двумя запросами: 6-9 и 50. Так получаем 2 запроса случайного чтения вместо 5. Это весьма полезно для HDD с медленной механикой, но ещё и приносит свои, хоть и более скромные, дивиденды для SSD - они хоть и на порядки быстрее HDD в случайном чтении, но и им тоже удобнее последовательное, а не случайное чтение.

    Вот MRR этим как раз и занимается. Сначала получает список необходимых ключей от индекса, сортирует этот список и запрашивает у диска не по одной записи в случайных местах, а более крупными последовательными блоками.
    Замечу, что MRR вступает в дело, если надо много чего прочитать с диска. Т.е. холодное чтение, данных для этой выборки по большей части нет в памяти. Разумеется, это далеко не быстрая штука.

    И ещё момент: у вас в запросе нет order by, но есть limit - это значит, что вам всё равно, какие именно строки выбрать. Mysql в таком случае будет возвращать любые подходящие строки в любом порядке на своё усмотрение.
    Ответ написан
    3 комментария
  • Как улучшить код аутентификации пользователя?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Спасибо, конечно, что не md5, но используйте нативный password_hash.
    Что за дичь идёт в следующих 5 строках после $stmt->execute?
    application/json в заголовке совершенно не вяжется с остальным кодом.
    Ответ написан
  • При запуске игр компьютер уходит в перезагрузку, в чем может быть причина?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Какой-то хренью на заявленные 370вт пытаться запитать GTX 970 (145вт по паспорту), FX-8320 (125вт по паспорту) и остальную мелочёвку?
    Рисковый вы человек.
    Ответ написан
    3 комментария
  • Какое железо для домашнего сервера?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Слежу на одноплатниками не очень пристально, но можете ограничиться одним требованием на 2 и более SATA и уже получить пустое множество. Больше 1 SATA на одноплатниках не видел.

    Под вменяемый NAS, а не подцепить к роутеру 1 внешний hdd на usb, классический путь пока актуален. Можно взять mITX + picoPSU какой-нибудь для экономии размеров.
    Ответ написан
    Комментировать
  • Как сделать сортировку SELECT FROM SELECT с последними состояниями устройств?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Ошибка в том, что так делать вообще нельзя. Даже этот странный mysql актуальный версий при дефолтном sql_mode откажется такое выполнять.

    Если порядок событий допустимо считать по старшинству id:
    select /**/ from `object_log`
        join (
            select max(id) as id 
                from `object_log`
                group by `id_gsm`
    ) lastevents using(id)
    ORDER BY `id_gsm` ASC
    Ответ написан
    Комментировать
  • Где хранит данные(пользователей, например) ejabberd2?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    нужно добавить пользователей

    ejabberdctl register <username> <domain> <password>


    Можно ли его заставить использовать mysql

    Сами гуглить не пробовали, видимо?
    https://docs.ejabberd.im/admin/guide/databases/mysql/

    Используемая по-умолчанию нативная база может быть расположена в разных местах. Например, в /var/lib/ejabberd/
    Ответ написан
    3 комментария
  • Как убрать запятую в конце массива?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Как насчёт формировать json не через одно место, а штатными функциями? json_encode
    Ответ написан
    Комментировать
  • Влияет ли директива "max connections" в mysql на работу нескольких сайтов расположенных на одном сервере?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    https://dev.mysql.com/doc/refman/5.7/en/too-many-c...
    If you get a Too many connections error when you try to connect to the mysqld server, this means that all available connections are in use by other clients.


    "Too many connections" является следствием превышения директивы max connections
    Количество сайтов, серверов или других клиентов базы с этим никак не связано. Хотя помогает быстрее в этот лимит упереться.
    Ответ написан
    2 комментария
  • Как функцию в php переименовать?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    А зачем вам вообще понадобился include_once? Да ещё так часто, что захотелось использовать невнятное имя функции?
    Во вьюхах once не используется, для загрузки классов - autoload, и затем, autoload composer'а вовсе исключили необходимость в написании include. Загрузка объявлений функций? Ну, ок, для функций автозагрузки действительно нет. Почему тога вы не можете использовать короткую функцию, которую привели в вопросе?
    Ответ написан
    2 комментария
  • Разница в индексах mysql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Составной индекс должен быть именно age_country, а не наоборот.

    Как раз наоборот.

    mysql обычно использует подвид btree. У btree поиск левосторонний, т.е. по индексу age & country можно обрабатывать запросы по age. А по индексу country & age искать только age уже нельзя.

    И какова разница между индексом age_country и отдельно двумя индексами для age и для country?

    Вы ищете пользователей некоторой страны с возрастом от 25 лет.
    Перед вами справочники:
    0) пользователи отсортированы по возрасту (в пределах одного возраста - вперемешку) - вам достаточно пролистать до начала 25 лет, а дальше вчитываться в каждого пользователя и искать нужную страну. Справочник вам не поможет в этом. Индекс age
    1) пользователи отсортированы по стране. Вы быстро находите всех из нужной страны, а затем вчитываетесь в каждого пользователя и смотрите возраст. Индекс country
    2) пользователи отсортированы сначала по возрасту, в пределах одного возраста дополнительно отсортированы по стране. Быстренько листаете до 25 лет, в пределах каждого возраста листаете до нужной страны. Как-то не очень удобно? age & country
    3) пользователи отсортированы по стране, пользователи одной страны отсортированы вдобавок по возрасту. Быстренько листаете до нужной страны, быстренько пропускаете всех младше 25 лет - читаете остаток, поглядывая только, что страна не изменилась. country & age

    Какой справочник захотите использовать?
    А если я скажу, что в справочнике помимо сортировки других данных пользователя нет? И чтобы по индексу country уточнить возраст пользователя вам необходимо посмотреть id человека и сходить за остальными данными в картотеку?

    Вы можете взять справочник по стране, переписать все id людей, затем взять справочник по возрасту, и поискать в диапазоне от 25 лет записанные id людей. Потратите много сил на сравнение, не так ли? Вот и mysql умеет index intersect, но операция эта не бесплатная.
    Ответ написан
    Комментировать
  • Как сделать группировку по двум срезам?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    with vertex_cost as (
    select fid_id, sum(vertex_cost) as vertex_cost /*min, max аналогично*/ from vertex group by fid_id
    ),
    edge_cost as (
    select fid_id, sum(edge_cost) as edge_cost /*min, max*/ from edge group by fid_id
    )
    select id, name, vertex_cost, edge_cost
        from fig
        left join vertex_cost vc on fig.id=vc.fig_id
        left join edge_cost ec on fig.id=ec.fig_id

    Если у фигур косты есть всегда - то заменить left join на join. Сейчас фигура будет возвращена всегда, но с NULL.

    Если надо предварительно пофильтровать сами фигуры:
    with figures as (
    select id, name from figures where name like 'foo%'
    ),
    vertex_cost as (
    select fid_id, sum(vertex_cost) as vertex_cost /*min, max*/ from vertex where fig_id in (select id from figures) group by fid_id
    ),
    edge_cost as (
    select fid_id, sum(edge_cost) as edge_cost /*min, max*/ from edge where fig_id in (select id from figures) group by fid_id
    )
    select id, name, vertex_cost, edge_cost
        from figures
        left join vertex_cost vc on figures.id=vc.fig_id
        left join edge_cost ec on figures.id=ec.fig_id
    Ответ написан
    Комментировать
  • Как сравнить две даты?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    $str_date = "2001-01-01 15:20:20";
    $date1 = new \Datetime($str_date);
    $str_date = "2014-11-23 21:30:00";
    $date2 = new \Datetime($str_date);
    
    if ($date1>$date2) {
    //
    }
    Ответ написан
    2 комментария
  • Странные сообщения при выполнении команды update-grub. Цел ли HDD\SSD?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Какие файловые системы-то на разделах в действительности? Или, может там LVM или ещё чего интересно?

    Почти наверняка у вас стоит пакет os-prober. Он вызывается при update-grub и ищет по всем блочным устройствам загрузчики других операционных систем. Для этого дёргает драйвера разных файловых систем, а те, в свою очередь, жалуются в dmesg, что не видят на этом разделе такой файловой системы.
    Ответ написан
  • Как обновить пакет postgresql в debian?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Стоит, и однозначно стоит, если вы с ним работаете. postgresql весьма активно развивается. Один jsonb в 9.4 чего стоит.

    9.1 в репозиториях - это получается у вас wheezy? https://packages.debian.org/search?keywords=postgr...
    Можете поставить просто из backports
    А можете с официального репозитория postgresql: https://www.postgresql.org/download/linux/debian/ Там вижу даже ещё не вышедший 9.6, не говоря уже про 9.5.
    Ответ написан
    Комментировать
  • Как пользоваться SET в Mysql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Суть типа данных set - 64-битная битовая маска со встроенным человечным именованием значений.
    Желаемый фильтр делается условием:
    where FIND_IN_SET('доставка2', delivery_type) or FIND_IN_SET('доставка3', delivery_type)
    Ответ написан
    Комментировать
  • Как подготовить запрос SQL в PHP?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    - $sql = 'SELECT * FROM items WHERE item_name LIKE %:query%';
    + $sql = 'SELECT * FROM items WHERE item_name LIKE :query';
    - $result->bindParam(':query', $query, PDO::PARAM_STR);
    + $result->bindParam(':query', '%'.$query.'%', PDO::PARAM_STR);

    И проверьте свой PDO::ATTR_ERRMODE. Должен быть PDO::ERRMODE_EXCEPTION
    Ответ написан
  • Сайт открывается, но не пингуется. В чем может быть проблема?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    На машине запрещён ICMP трафик весь или конкретно echo-request
    Ответ написан
    4 комментария
  • Как организовать выборку из таблицы MySQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    По разному можно поизвращаться. Например,
    select /**/ from tablename join (
        select id_client, max(next_talk_date) as last_date from tablename where id_client in (/**/) group by id_client
    ) lastdate using(id_client)
    where id_client in (/**/) and next_talk_date >= CURRENT_DATE and (next_talk_date = last_date or next_talk_date > CURRENT_DATE)

    По индексу id_client & next_talk_date должен бегать внятно.

    Или так:
    select /**/ from tablename t
    where id_client in (/**/) and (
        next_talk_date > CURRENT_DATE or not exists (
            select 1 from tablename n 
            where n.id_client = t.id_client and n.next_talk_date > t.next_talk_date
        )
    )
    Ответ написан
  • Как в postgresql на Ubuntu посмотреть содержимое таблицы с "_" в названии?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    С чего вы взяли, что проблема в символе _ в названии? Хотите сказать, что другие такие же синтаксически некорректные запросы работают?

    Откройте любой материал по SQL и сравните с тем, что вы написали.
    Если разницу не видите где-то в промежутке между словом select и именем таблицы - сходите погулять или поспать или ещё чего поделать постороннего.
    Ответ написан
    1 комментарий