Задать вопрос
  • Почему далеко не на всех сайтах есть каптча?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Капча лишняя по своему определению. Мешает, раздражает и никак не упрощает жизнь пользователя.
    И лишь вынужденное зло для отсева наиболее глупых ботов.

    Ведь легко можно написать скрипт, какой регистрируется сразу сотню левых аккаунтов на сайте, не успел оглянуться, и бд уже в ботах.

    И пусть. Нормально сделанной базе плюс-минус лям пользователей - не вопрос.

    Тоже самое с комментариями, легко сделать скрипт чтобы оставлял с разных ботов в разных топиках комментарии с рекламой.

    С этим сложнее. Если есть пользовательский контент - то сначала необходимы люди, которые будут его модерировать (не забудьте сделать внятный инструмент модератора для поиска и удаления пачкой комментариев по шаблону). Антиспам автоматика не исключает необходимости в людях, которые будут проверять вручную. Вы видели спам на stackoverflow? А попадается и там.
    И капча, разумеется, не панацея тоже.
    Ответ написан
    2 комментария
  • Как составить запрос для выборки по времени из TIMESTAMP?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Правильно, хех?
    А правильно - включает в себя "чтобы быстро работало"?
    Чтобы работало медленно всегда, но просто:
    where time(timestamp) = '14:30:00'
    Чтобы работало быстро - материализовать time(timestamp) в generated column (5.7, отдельно уточните какая версия нужна для построения индекса по ним) или в отдельное поле типа time (тогда плюс соответственно триггеры для поддержания актуальности данных в поле) и повесить поверх индекс.
    where timestamp_time_field = '14:30:00'
    Ответ написан
  • Можно ли создать raid1 из 2 дисков, если на одном есть данные, не потеряв их?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Массив можно создать в деградировавшем виде:
    mdadm -C /dev/md0 -l 1 -n 2 missing /dev/sdc
    Затем скопировать данные на массив
    rsync sdb -> md0
    И добавить диск в массив
    mdadm /dev/md0 -a /dev/sdb
    Ответ написан
    7 комментариев
  • Как найти вывести список всех не найденных значений из массива?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    select children.code is null as is_not_found, /*another children data is null too*/ 
    from unnest(array[...]) as code 
    left join children using(code)
    Ответ написан
    Комментировать
  • Как сделать временную таблицу с одинаковыми данными?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    небольшая ремарка №3: а нафига вам вообще cross join понадобился?
    SELECT 'Economy' FROM generate_series(1,10);
    Ответ написан
    1 комментарий
  • Как понять запрос к MySQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Это то, как НЕ надо делать фильтр, если нужны строки за определённый месяц.
    Потому что mysql не умеет функциональные индексы, значит если даже индекс подходящий по дате есть - использоваться он не будет. Должно быть:
    WHERE f=1 
    AND tab.site_id = '5568' 
    AND user_payment >=  '2016-06-01' 
    AND user_payment <  '2017-07-01'

    Что отлично пойдёт по индексу, например, site_id, user_payment. Надо ли сюда включать f - смотрите ваши данные, вам лучше знать вашу базу.
    Ответ написан
    2 комментария
  • Как правильно изменить месторасположение базы postgresql-9.2.18.rl7?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    С большим даунтаймом, зато целиком на новый диск:
    Потушить базу, скопировать PGDATA (data_directory в конфиге) в новое место, заменить data_directory в конфиге на новое место, запустить базу.
    Можно, кстати, не менять data_directory, а сделать симлинк. Postgresql не против по симлинкам сходить за своими данными.

    С небольшим даунтаймом, зато с чуть большим числом телодвижений:
    через pg_basebackup сделать копию в новом месте, запустить там второй инстанс постреса с репликой. Когда реплика догонит мастер, потушить мастер (сделав checkpoint), потушить реплику (тоже с чекпоинтом), заменить data_directory в конфиге на новое место, запустить базу.

    Без даунтайма:
    инициализировать второй диск как tablespace, перенести на этот tablespace что мешается на основном (pg_repack попробуйте, емнип умеет без пишущего лока даже переносить). Использоваться будут оба диска, что кстати хорошо с точки зрения io.
    Ответ написан
    2 комментария
  • Сервер не осуществляет проверку имени в БД и все равно регистрирует пользователя, в чём проблема???

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    LIMIT 1,1

    Т.е. разрешено два пользователя с одним именем.

    И никогда не подставляйте данные в текст запроса. Используйте prepared statements.

    $arr = array('$login','$tel','$email');

    Без комментариев. Посмотрите, что в переменной записано, удивитесь.
    Ответ написан
    1 комментарий
  • Нужен ли primary key для такого?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    primary key нужен всегда.
    Если по логике вашего приложения одному user_id может соответствовать только один пользователь в каждом service_id - то PK на первые два поля.
    Если несколько - то pk на 3 поля.

    Порядок полей при указании PK таблицы связей важен. Для mysql/innodb очень важен, т.к. таблица кластеризована по PK и любое обращение по вторичному ключу влечёт поиск по PK (кроме покрывающих индексов). Порядок выбирайте исходя из наиболее частых запросов к таблице, чтобы максимум запросов могло идти по первичному ключу.
    Ответ написан
    Комментировать
  • Как замониторить банусер?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Нет, сам postgresql о существовании баунсера вообще не знает. pgbouncer является обычным libpq клиентом с точки зрения базы.
    Ответ написан
  • Быстрее ли несколько параллельных запросов одного последовательного?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Есть ли в распараллеливании запросов рациональное зерно?

    Есть, если треды не дерутся за одно и те же ресурсы. Например, ходят в физически разные кластеры БД.

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

    Или вы неверно описали наблюдаемый результат или же параллельное выполнение медленнее в 2 раза и дальше ухудшается при конкурентной нагрузке.

    На каком-то этапе параллельные запросы также выстраиваются в очередь.

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

    Если в то же время подать аналогичные запросы с другого клиента, то время ожидания ещё больше растягивается.

    Что подтверждает диагноз. Ресурсов для параллельного выполнения нет.

    Поскольку вопрос затрагивает субд и вы не называете, что там происходит - самое очевидно - вы упёрлись в диски. Возможно даже в механические диски. Добавление новых io задач на диски ожидаемо и очень сильно замедляет весь остальной io.
    Ответ написан
    2 комментария
  • Как удалить элемента из массива Json по ключу?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    PHP не делает различий между списком и нумерованным списком. Массив json же ключи иметь не может. Поэтому в попытке сохранить ключи массива json_encode делает объект с числовыми ключами. Для получения json array необходимо сбросить ключи массива, например:
    $myArr["features"] = array_values($myArr["features"]);

    перед вызовом json_encode
    Ответ написан
    Комментировать
  • Как реализовать ИЛИ без использования скобок?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Какой диалект?
    В PCRE есть группа без запоминания (?:skype|скайп)
    Ответ написан
    2 комментария
  • Doctrine DQL: как выбрать объекты из двух таблиц с разными условиями?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Проблема - условие WHERE работает только для первой таблицы, а из второй выбираются все элементы.

    Вывод неверен. Выполняются оба условия, гарантированным seqscan'ом по events, если повезёт то index scan'ом по weekday. А в результате, как в запросе и написано - выборки перемножаются между собой в cross join.

    Если таблицы не связаны и нужен плоский список - то здесь нужен именно union all. Глупая доктрина его не умеет. Возможные методы извращения без union глупая доктрина не умеет тем более.
    Значит или обучать доктрину делать union all (вероятно, нетривиально)
    или делать два запроса (всё равно у вас сейчас seqscan, значит производительность вам не нужна и explain никто не смотрел)
    или делать вьюшку в базе с union all и ходить к ней вместо таблиц (и проверить, умеет ли планировщик каждой из поддерживаемых баз вообще прокидывать условия внешнего запроса во вьюшки с union all)
    или использовать native query с нормальным SQL

    PS: да, я с доктриной работал и именно поэтому её сильно не люблю за ограниченность синтаксиса, при том всё равно с нещадно текущими абстракциями и необходимостью знать и учитывать чем именно каждая поддерживаемая база отличается от других. И нафига эта доктрина тогда вообще жрёт столько cpu и памяти?
    Ответ написан
    4 комментария
  • Как увеличить размер / в Ubuntu 16 server?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Судя по характерному имени блочного устройства - у вас система стоит на LVM.
    Соответственно помимо увеличения блочного устройства и расширения ФС необходимо сказать LVM, что блочное устройство стало побольше и сказать увеличить логический том.
    pvresize /dev/sda5
    lvextend -l +100%FREE /dev/mapper/ubuntu--vg-root

    Затем уже resize2fs
    Ответ написан
    1 комментарий
  • Как написать бесконечный по времени sql запрос?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    select sleep(столькосекундскольконравится);

    Плюс см https://dev.mysql.com/doc/refman/5.7/en/server-sys...
    Ответ написан
    Комментировать
  • Почему тормозит видео html5, flash в debian 7 с radeon HD 4850?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Обновляйтесь на актуальный релиз дебиана. Открытый radeon драйвер 2012 года и 2017 - две очень огромных разницы.

    Или ставьте проприетарный. Не уверен только, который. В описании fglrx в пакетах дебиана уже не говорится про 4ххх серию, но вроде бы поддержка 4ххх была до 13.1 драйвера. Если не запустится, то пробовать ставить fglrx-legacy-driver из бекпортов)
    Ответ написан
  • Необходим поменять формат времени в запросе, как?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    формат времени с mysql на postgresql

    done by sql design.
    Форматы даты, времени, датывремени эквиваленты. И, емнип, вовсе стандартны для SQL в целом.
    Если вы пихаете данные в неподходящий тип данных вместо штатного для обеих субд timestamp - то вас будут ждать сюрпризы рано или поздно. Это как бы само собой разумеется.

    Если ваш clock, как очевидно по комментарию в другом ответе, int4 является количеством секунд с начала этой эпохи, то привести unixtime к циферке-количеству-секунд-этой-эпохи можно через extract:
    hs.clock > extract(epoch from timestamp 'yesterday')

    Привести циферку количества секунд в этой эпохе к timestamp можно функцией to_timestamp.
    Ответ написан
    2 комментария
  • Как решить 1215, 'Cannot add foreign key constraint'?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Детали неудачного создания FK надо смотреть в innodb status, вы всё верно прикрепили в вопросу.
    Встречный вопрос вам: что именно в объяснении английским по цвету вашего терминала непонятно написано:
    Cannot find an index in the referenced table where the
    referenced columns appear as the first columns, or column types
    in the table and the referenced table do not match for constraint.

    ? На target таблице нет подходящего индекса для работы FK.
    Судя по названиям - где вы продолбали primary key?

    Ну и, конечно, нафига вам 4 одинаковых FK? На всякий случай?
    Ответ написан
    Комментировать