Задать вопрос
  • Как оптимизировать функцию обработки полей формы?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Но перед записью эти данные нужно обработать

    Зачем?

    Безопасно записать в СУБД - это prepared statements. Никак калечить пользовательский ввод для этого не нужно.
    Вывести в html - есть нативный htmlspecialchars.

    А вот в upd верное направление мысли. Абсолютно неважно, откуда данные - единственно важно куда эти данные пойдут. И именно для этого может понадобится дополнительная обработка именно для этого выходного формата.
    Отправка письма - plain text можно отправлять как есть. html - html и есть, всё тот же htmlspecialchars.
    Куда-нибудь в csv - используйте нативные функции обработки csv. json - json_encode. И так далее. Для каждого формата свои требования к оформлению пользовательского ввода.
    Ответ написан
    Комментировать
  • Почему незафиксированная транзакция может изменять данные?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Читайте далее. Это, судя по всему, прелюдия к описанию уровней изоляции транзакций.
    READ UNCOMMITTED - позволяет СУБД показывать данные, которые ещё не были зафиксированы. Это не значит, что именно так на этом уровне изоляции должна так себя вести СУБД, но поведение допускается стандартом для этого уровня изоляции. Например, в упомянутом postgresql на шаге t4 900 вы не сможете получить никогда, даже на read uncommitted.
    Ответ написан
    1 комментарий
  • Ошибка cannot add or update a child row при создании связи между таблицами, как исправить?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Существующие в таблицах данные не проходят проверку внешним ключом. Т.е. существуют ссылки на отсутствующие магазины.
    Ответ написан
    1 комментарий
  • Как влияет количество контактов в pci-e разьеме на работу видеокарт в crossfire?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    При построении crossfire доступна память только одной карты. Используются обе, но информация в них дублирована. Давняя проблема multiGPU конфигов.

    Второй слот: у вас даже если и присутствуют контакты в слоте физически - этот слот подключен к южному мосту через PCI-E 2.0 x4. Для тех GPU, из которых имеет смысл городить multigpu, а не осмысленнее взять карту уровнем выше и не страдать от отсутствия поддержки multigpu в играх - это бутылочное горлышко. Основной слот PCI-E x16 даёт пропускную способность в 4-8 раз выше (в зависимости от вставленного сокет CPU - слот подключен напрямую к CPU и тот определяет версию шины). Как думаете, что происходит при таком дисбалансе пропускной способности? CF реализован просто для галочки.
    Но отличная вещь для втыкания какого-нибудь рейд-контроллера PCI-E х4 или х8, или ещё чего-нибудь, чему мало х1 слота.

    По майнерам не подскажу.
    Ответ написан
    Комментировать
  • Что такое "Внешняя скорость передачи данных" HDD?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Под "Внешняя скорость передачи данных" в этом случае понимается пиковая теоретическая скорость интерфейса. Бесполезная циферка.

    Смотрите утилизацию сети и утилизацию диска. Возможно вы утилизируете полностью сеть. Гигабитку занять, в общем-то, не проблема.
    Ответ написан
    3 комментария
  • Какую выбрать конфигурацию RAID для домашнего NAS?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Софтовый рейд вас не ограничивает глупостями вроде 1 диск может быть только в одном массиве. Можно разделы одного диска объединять в разные массивы.
    Пилить диски можно как угодно. Например, распилить 3тб диски каждый на два раздела: по 1 и по 2тб каждый. Собрать в итоге два raid5: 3 тома по 1тб и три по 2тб. Итого 6тб форматированной ёмкости, допустимо выпадение любого диска массива. При необходимости в едином куске места - поверх этого развернуть LVM.
    Наращивать можно дисками любого размера, условие одно: добавляемый том не меньше используемого размера тома в действующем массиве.

    Про raid5 в домашних NAS - у меня два диска разом за 8 лет не умирало. Дефолтно в debian включен кроновый скрипт верификации всех софтовых рейдов раз в месяц. Пару дисков проблемных он и обнаружил заблаговременно.
    Но вот два диска разом выпасть из массива - это было. Кабель питания отошёл. Собрать обратно массив удалось, а вот ФС побилась. Но у меня был бекап, потеряны только неважные данные.

    Если нет никакой возможности использовать географически-удалённое место для бекапа, то для бекапа можно выделить области на этих дисках. Только не в составе чего-то сложного (lvm, raid) и не на том же диске, где лежит основная копия! Можно использовать raid1 при необходимости продолжать работу при отказе диска - зеркало хоть восстанавливать просто и достаточно одного любого диска.
    Например, порезать 3тб диски на два раздела: 2тб и 1 тб. Затем собрать raid5 на трёх 2тб томах - под всякое не очень нужное. Три раздела по 1 тб - под важные данные. Можно собрать raid1 из двух дисков. Но не как зеркало из всех 3 дисков! Это только от физической поломки поможет, а от проблемы с ФС - уже нет. Один раздел не должен быть примонтирован постоянно, монтируется только на время бекапа основной части. rsync в кроне как самый простой вариант. Лучше бы, как уже советовали, 3 независимых тома: актуальная копия, горячий регулярный бекап, последний диск под холодный бекап, его физически отключать (можно сколхозить автоматический девайс для размыкания цепей на твердотельных реле).
    Ответ написан
    Комментировать
  • Как сформировать sql запрос используя имена столбцов в виде массива?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    assert('!empty($fieldNames) and is_array($fieldNames)');
    $query = 'set field_name = (' . join(' + ', $fieldNames) . ')/' . count($fieldNames);


    Вероятна ошибка проектирования схемы БД. С учётом использования давным-давно удалённых функций mysql_* вероятность ошибки, а не осмысленного выбора резко увеличивается.
    Ответ написан
    Комментировать
  • Как сэкономить ресурсы оперативной памяти при кодинге в Ubuntu?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    swap в наличии. Так что описываемое поведение вполне норма, когда начинает подходить к концу свободная памяти и ОС лезет в swap (что можно проконтролировать вызовом free при начале проблем). Немного странно выглядят падения расширений, но, возможно, их отстреливает хром за слишком долгий отклик.
    Для начала стоит покрутить swappiness, чтобы ОС лезла в свап только в крайнем случае.
    Затем поиграть в Zswap, zram. Что порежет производительность CPU, но поможет от нехватка памяти.

    Раз на всё памяти не хватает - то есть варианты действий:
    - отчаянно тормозить в свапе
    - звать на помощь OOM killer, который будет убивать какой-нибудь на его усмотрение бесполезный процесс. Для этого достаточно вырубить swap и ядро само позовёт при необходимости.
    - добавлять память
    - уменьшать потребление памяти. Следить, кто сколько памяти жрёт, может у вас кто-нибудь не особо нужный просто течёт по памяти. Можно запускать текущие процессы в cgroup с жёстким лимитом памяти, тогда они будутт отстреливаться при превышении лимита.
    Ответ написан
    1 комментарий
  • Какие есть инструменты для отладки запросов к БД?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Со стороны СУБД:
    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.
    Из самого кода проекта - непосредственно библиотеки доступа к субд профилированием не занимаются. Поэтому нужно смотреть конкретный проект, есть ли там место, куда можно воткнуть профилирование запросов.
    Ответ написан
    Комментировать
  • Как отсутствие id (int - primary key, auto_increment) поля влияет на скорость работы MySQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Касательно именно mysql/innodb - innodb всегда кластеризован по первичному ключу. Поэтому все вторичные индексы всегда указывают на первичный ключ. Что из этого следует:
    select time, md5 from img where md5=?
    Потребует просмотра всегда двух индексов. Сначала индекса по md5, потом - первичного ключа.
    С первичным ключом по md5 этот запрос сделает один просмотр индекса и для вычитывания time, не входящего в индекс, даже не потребует seek - данные лежат непосредственно рядом с листьями первичного ключа. Т.е. от выкидывания суррогатного ключа этому запросу чистый профит.

    Не случайно написал time в запросе, если запросить только select md5 или select md5, id - то это будет index only scan по вторичному ключу и сейчас, без обращения ни к первичному ключу ни к самой таблице.

    во-вторых,
    int - это 4 байта. varchar32 для cp1251 (почему вообще varchar, а не char(32) или вообще binary(16)?) - 32 байта, timestamp 4 байта. Из-за необходимости ссылаться на куда более объёмный первичный ключ, резко увеличатся в объёме все вторичные индексы. Но вторичный индекс у вас останется только один, да один индекс исчезнет, а уникальный немного похудеет за счёт преобразования в первичный. Не столь огромный оверхед получится, вполне можно пережить. Но может быть не столь интересно, если показана часть таблицы и есть кучка других полей и индексов.
    Поиск по time чуток просядет, строки сравнивать всё-таки сложнее пары интов. Но на десятке млн записей, да на mysql значения это играть не будет.

    в-третьих, innodb оптимизирован под запись последовательно-возрастающих значений. На записи случайных данных несколько просядет производительность. На сколько именно - надо измерять, не помню.
    На небольшой табличке всего-то в пару десятков миллионов строк - это значения иметь не будет.
    Ответ написан
    3 комментария
  • Тормозит mysql, это кэш?

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

    Нет, mysql как раз кеширует непосредственно результат конкретного запроса.
    План запроса строится заново для каждого запроса, не найденного в query cache.
    query cache может быть и выключен, тогда mysql от запроса не кеширует ни план, ни результат.

    Если запрос выполняется к редкоиспользуемой части данных - значит скорей всего пришлось читать с диска. Это варьируется от медленно до смертельно медленно в зависимости от дисков. Затем данные будут жить в кеше данных mysql (см. тюнинг используемых storage engine) и в кеше операционной системы (плюс в query cache результат запроса), пока не будут оттуда вытеснены другими более нужными данными. Сами индексы тоже могут выгружаться из памяти и даже index only scan может пойти на медленный диск.
    Запрос, которому пришлось лезть на диск и запрос, все данные для которого уже оказались в памяти - две огромные разницы даже для приличных SSD.
    Ответ написан
    Комментировать
  • Почему пропадает значение переменной при подключении к БД?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Давно удалённая функция mysql_query попытается сначала найти уже открытое ранее соединение через mysql_connect. Если такого нет - попробует сама установить соединение с дефолтными настройками root@localhost,, без пароля.
    Что в тексте ошибки и видно.
    Ответ написан
    Комментировать
  • Как хранить конфиги на сервере в зашифрованном виде?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    А смысл?
    Чтобы подключиться к базе, надо знать действительные логин/пароль. Значит код расшифровки будет здесь же доступен.
    Если к базе подключаться не надо - то и конфига здесь не будет.
    Ответ написан
    Комментировать
  • Процессор Intel i7 6800K - 6950K что ли не поддерживают RAM более 2400 MHZ?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Официально да. Интел уже давно занижает официальные режимы работы контроллера памяти. Заявленные режимы памяти, поддерживаемые матплатой - работать будут.
    Ответ написан
    2 комментария
  • Как удаленно установить программы на несколько компьютеров с ОС ubuntu?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    ansible/salt/chef/puppet. Особенно если задача не одноразовая.
    Ответ написан
    Комментировать
  • SQL вставка текста в столбец перед нативным текстом, можно ли и как?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    "нативный текст" - это то, что в поле уже есть до выполнения запроса?

    update tablename set img_url = concat('/images/', img_url);
    Ответ написан
    2 комментария
  • Как проверить существование БД?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Подключиться и скомандовать
    show databases like 'db_name'
    Будет строка в ответе - значит есть БД. Пусто - значит нет такой.

    Плюс, create database умеет идемпотентное поведение
    CREATE DATABASE IF NOT EXISTS db_name
    dev.mysql.com/doc/refman/5.7/en/create-database.html
    Ответ написан
    3 комментария
  • Какую функцию агрегации использовать в запросе с GROUP BY?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Ожидал получить в выборке не более одной строки с каждым ref_id

    GROUP BY ref_id, id

    С чего бы это вы ожидали увидеть только один ref_id, если явно сказали затем группировать по id?
    С учётом названия и того, что postgresql в принципе согласился запрос выполнить - id является первичным ключом. А группировка по первичному ключу ожидаемо результат не изменит.

    select  distinct on (ref_id)  ref_id,  id,  created_at from tablename  order by ref_id, created_at desc;
    Ответ написан
    3 комментария
  • Как сделать два монитора с двумя учетными записями?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    https://habrahabr.ru/post/312900/
    К сожалению, пока потребуется отдельная видеокарта для каждого места.
    Ответ написан
    3 комментария
  • Кака настроить доступ к разным ресурсам с разных провайдеров?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Реально. А в чём проблема? Самое просто - завернуть порты pop/imap/smtp, можно даже не прикручивать проверку, на каких нынче адресах почта живёт, а любую почту через этого провайдера пустить.
    Ответ написан
    Комментировать