Ответы пользователя по тегу MySQL
  • Триггер на изменение данных?

    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
    Нет, не ускорит. Нужен функциональный индекс именно по length(field).

    mysql 5.7.6 позволяет создать вычисляемые поля: https://dev.mysql.com/doc/refman/5.7/en/create-tab...
    Это может быть STORED значение - т.е. будет занимать место как обычное поле, но вычисляться автоматически при добавлении/изменении строки. Может индексироваться всё с той же 5.7.6. И может быть virtual - такое поле вычисляется при обращении, не хранится на диске, но может индексироваться только с версии 5.7.8.

    Если ваша версия старая и не умеет генерируемые колонки - то в вашем распоряжении всё ещё остаются старые методы для имитации функционального индекса: создаёте ещё одно числовое поле, куда сохраняете длину текста. Индексируете как обычно. За актуальностью данных могут следить пара триггеров на before insert и before update.
    Ответ написан
    Комментировать
  • Миграция вешает сайт?

    Melkij
    @Melkij
    PostgreSQL DBA
    Изменение схемы в MySQL на лету - это своя особая песня.

    MySQL 5.6+: https://dev.mysql.com/doc/refman/5.6/en/innodb-onl...
    Или делать что-то странное, как в старые тяжёлые времена. Людьми, связавшимися с mysql, были изобретены разные методы. От извращений с созданием новых таблиц и триггеров до statement-репликации и alter table на слейве, затем объявление этого слейва новым мастером.
    Ответ написан
    Комментировать
  • Как сделать выборку и поиск по трём таблицам?

    Melkij
    @Melkij
    PostgreSQL DBA
    Релевантный поиск на лайках? Мда.
    Возьмите нормальный FTS (elasticsearch, shpinx), ну или хотя бы его встроенное в mysql подобие dev.mysql.com/doc/refman/5.7/en/fulltext-search.html
    Ответ написан
    Комментировать
  • Как импортировать XML dump в MySQL через консоль?

    Melkij
    @Melkij
    PostgreSQL DBA
    Нафига было делать XML экспорт? Судя по тегам - читать это может только сам phpmyadmin. Поставьте на виртуалку lamp, импортируйте этот дамп, экспортируйте в нормальный sql - импортируйте на целевой машине нормальным способом.
    Или поставьте на виртуалку lamp, настройте проброс портов до целевой машины (например, силами SSH) и импортируйте через phpmyadmin.
    Ответ написан
  • Как оптимизировать данный SQL код?

    Melkij
    @Melkij
    PostgreSQL DBA
    DATE(orders.created_at) >= :start

    Никогда не использовать условия такого плана. Это прямой запрет использования индекса по created_at, довольно вероятно селективного для этих запросов.

    SELECT orders.delivery, SUM(orders.delivery) AS summ
              FROM orders
              JOIN baskets ON  orders.basket_id=baskets.id
              WHERE baskets.purchase_status = 3 AND orders.deleted_at IS NULL 
                  AND orders.created_at >= :start AND orders.created_at <= (:finish + interval 1 day)
              GROUP BY orders.delivery

    И разобрать несколько строк ответа на приложении.

    SELECT SUM(if(orders.delivery = "kazpost", orders.delivery,0)) AS kazpost,
    SUM(if(orders.delivery = "courier", orders.delivery,0)) AS courier,
    SUM(if(orders.delivery = "pickup", orders.delivery,0)) AS pickup
              FROM orders
              JOIN baskets ON  orders.basket_id=baskets.id
              WHERE baskets.purchase_status = 3 AND orders.deleted_at IS NULL 
                  AND orders.created_at >= :start AND orders.created_at <= (:finish + interval 1 day)

    В одну строку.

    Затем смотреть explain
    Ответ написан
  • Как указать срок действия подтверждения регистрации?

    Melkij
    @Melkij
    PostgreSQL DBA
    Сутки так по-английски и пишутся:
    DELETE FROM Users WHERE regdate < (NOW() - interval 1 day) AND confirmed = 0;
    Ответ написан
    2 комментария
  • Как составить запрос на выборку в Mysql?

    Melkij
    @Melkij
    PostgreSQL DBA
    mysql... Опять же нет никаких средств сгенерировать табличное представление из внешних данных, кроме:
    Сделать временную таблицу
    create temporary table external_geo_ids (ext_id int(11) not null);
    insert into external_geo_ids values (1),(2),(-1);
    select /**/ 
    from external_geo_ids 
    left join geo_regions_yandex on GeoRegionId=ext_id;

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

    Или на лету джойнить подзапрос с бесконечными union all
    select /**/ 
    from (
        select 1 as ext_id
        union all
        select 2
        union all
        select -1
    ) external_geo_ids 
    left join geo_regions_yandex on GeoRegionId=ext_id;
    Ответ написан
    Комментировать
  • Возможно ли отсортировать недвижимость где владелец был один и тот же больше трёх лет подряд?

    Melkij
    @Melkij
    PostgreSQL DBA
    У mysql с такими запросами печально. Ни оконных функций, ни ещё чего-нибудь полезного.

    В порядке утреннего бреда решение в лоб:
    select property_reg_num, property_owner_name_id from
        tablename y1
        join tablename y2 using(property_reg_num, property_owner_name_id)
        join tablename y3 using(property_reg_num, property_owner_name_id)
    where y2.property_record_on_year = y1.property_record_on_year + 1
    and y3.property_record_on_year = y2.property_record_on_year + 1

    С уникальным ограничением по property_reg_num & property_owner_name_id & property_record_on_year результат должен быть правильным.
    Ответ написан
    Комментировать
  • Почему у меня выводятся ???? мнесто кракозябр?

    Melkij
    @Melkij
    PostgreSQL DBA
    set names - решение неверное, что даже заслужило отдельной страницы в мануале: php.net/manual/en/mysqlinfo.concepts.charset.php

    Решение правильное:
    $mysqli->set_charset('utf8');
    Ответ написан
    Комментировать
  • Как правильно сформировать запрос к 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
    );
    Ответ написан
    Комментировать
  • Подсчёт количества рядов: подзапрос или left join?

    Melkij
    @Melkij
    PostgreSQL DBA
    select
      a.id, a.title, a.content,
      count(c.id) comments
    from
      articles a
      left join comments c on c.article_id = a.id
    group by a.id

    Зачем вам count distinct тут внезапно понадобился и где потеряли группировку?

    Вообще count под OLTP жуткая вещь с точки зрения базы - это надо прочитать каждую строчку, проверить её видимость в текущей транзакции, проверить на null и всё только ради одной циферки. Добавьте в articles колонку с числом комментариев, а за актуальностью могут следить несколько простых триггеров.
    Ответ написан
    2 комментария
  • Как организовать репликацию БД?

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

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Приведите в нормальную форму - тогда это будет элементарный запрос.
    Нормальная форма - технический термин, если что.
    Ответ написан
    Комментировать
  • Можно ли просто копировать файлы MySql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Текстовые? Нет, текстовые не выйдет. В /var/lib/mysql/ бинарные файлы. Чуток текстовых там, конечно, тоже есть, но данных в бинарных.

    Делаете копию каталога (внимание на права доступа и владельцев файлов, это тоже важно и их надо сохранить) datadir. По-видимому, у вас это /var/lib/mysql/
    Переносите на машину с той же самой версией mysql, лучше в точности ту же версию, но можно в пределах минорных версий. Попутно делаете ещё одну копию с данных.
    Разумеется, на новой машине на момент копирования mysql должен быть остановлен.
    Запускаете mysql, читаете логи, исправляете ошибки.
    Дальше по обстоятельствам. Если завёлся - то проверяете свои данные, если нет - читаете дальше логи и гугл.
    Innodb при успехе восстановится до последней зафиксированной транзакции. myisam - даже в лучшем случае как повезёт. Устойчивость к сбоям - это не про него.
    Ответ написан
    1 комментарий
  • Автоматический set в mysql?

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    https://dev.mysql.com/doc/refman/5.7/en/account-na...
    dev.mysql.com/doc/refman/5.7/en/user-names.html
    Никак не повлияет. Допустимое имя. Иначе вы бы и не создали такого пользователя.
    Ответ написан
    Комментировать
  • Как верно проектировать базу данных?

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

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

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

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

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