Задать вопрос
  • Как сформировать 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, можно даже не прикручивать проверку, на каких нынче адресах почта живёт, а любую почту через этого провайдера пустить.
    Ответ написан
    Комментировать
  • MySQL: count(*) или table_rows или ...?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    innodb - это MVCC.
    Чтобы узнать, сколько строк в таблице - нужно узнать, какие версии строк может видеть эта транзакция. Без вычитывания всех подходящий строк ответ не получить. Разумеется, быстро это работать не будет.
    Поэтому данные в information_schema - приблизительная оценка всегда.

    Уменьшайте объём данных. Например, если вы растёте по шкале времени, то стройте аггрегаты по времени заранее. Например, по дням и часам. Текущий час s/вычитывать count'ом/инкрементить в каком-нибудь редисе или мемкеше вместе с insert'ами/g,, потом пересчитывать и сохранять к другим аггрегатам.
    Ответ написан
  • SSD вместо RAM?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    есть SSD с достаточно высокой скоростью чтения/записи

    Недостаточной. Весьма недостаточной. Настолько, что в самих flash SSD распаяны чипы DRAM для нужд кеша и контроллера. Сейчас типично DDR3, объёмом 64-1024мб в зависимости от модели.

    Латентность доступа на чтение SSD весьма далека от латентности RAM в пару десятков нс.
    Латентность записи - пока есть свободные страницы для записи ещё ничего, а вот если свободных страниц нет - то привет. Латентность растёт крайне существенно.

    Магниторезистивная память либо память на основе фазового перехода - вот чем некоторые компании надеются заменить DRAM. Пока безуспешно.
    Ответ написан
    Комментировать
  • Какой учебник по SQL почитать?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Must read по mysql: High Performance MySQL Optimization, Backups, and Replication, Baron Schwartz

    Для теоретических знаний - относительно недавно в реляционных базах принципиально ничего не менялось, как и десятилетие назад. И два десятилетия и может даже три. Фундаментальная теория РСУБД и транзакционных систем - да, из прошлого тысячелетия. За новизной в теории гнаться бессмысленно.
    Другое дело, если вы хотите особенности какой-то определённой СУБД. У каждой ворох своих особенностей, бывают и нарушения стандартов и что-нибудь меняется с каждым релизом. Лучший друг - мануал от корки до корки, книги поздновато выходят. Можно много полезного вычитать.
    Ответ написан
    1 комментарий
  • Как записать иконки в БД?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Во-первых, используйте нормальные подготовленные выражения или хотя бы не отключайте эмуляцию в PDO. Ничего они не порежут. Реальные подготовленные выражения пойдут вообще как есть в бинарном виде, эмуляция в PDO сделает всё возможное для корректной передачи.

    Второе - используйте кодировку utf8mb4. Если вы думаете, что utf8 в mysql и utf8 в остальном мире - это одно и то же, то вы ошибаетесь. Во всём мире в utf8 до 4 байт на символ, в mysql - только 3. Вот всякие модные нынче смайлики в этом 4 байте и живут.
    Ответ написан
    1 комментарий
  • Какие существую способы стабилизации процессов в linux?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Странное что-то рассказываете. У вас железо-то вообще исправно? memtest?
    sysrq жив? Скорей всего жив, раз вы можете на tty переключиться. Посмотрите, что ядро ответит https://en.wikipedia.org/wiki/Magic_SysRq_key
    Ответ написан
    3 комментария
  • Подойдет ли видеокарта моему PC?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Вам подойдёт любая PCI-E видеокарта. Любая.
    Ни процессор (разницей PCI-E 2.0 и 3.0 всё ещё можно пренебрегать), ни ваш 500вт блок питания (лимит по +12В, практически только и используемая современным железом) выбор не ограничивают.
    Ответ написан