Ответы пользователя по тегу MySQL
  • Двойная сортировка SQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Ваш пример сортировки не совпадает с описанным "сначало по статусу, а потом каждую группу по дате.". Строки 2 и 6.

    id--------name-----date----status
    1---------Ivan-----25.01-----1
    3---------Artem-----25.03-----1
    4---------Sasha-----25.04-----1
    6---------Gena-----25.06-----1
    2---------Sergei-----25.02-----2
    5---------Aleksei-----25.05-----2

    Вот так - order by status, date
    ASC и DESC исторически путаю, может быть order by status desc, date desc или что-то среднее между ними.
    Ну и если дата хранится именно вот так, а не внятным date, то могут разные странности сортировки как строки, а не якобы даты.
    Ответ написан
    Комментировать
  • Как создается индекс по колонке с типом datetime?

    Melkij
    @Melkij
    PostgreSQL DBA
    Потому что btree умеет обрабатывать не только равенство, но и запросы на диапазоны данных.
    Как именно на уровне кусочков данных - изучайте структуру b-tree и других деревьев поиска.
    Ответ написан
    Комментировать
  • Работает ли второй индекс после первого?

    Melkij
    @Melkij
    PostgreSQL DBA
    Порядок условий в запросе значения не имеет. mysql тупой, но, к счастью, не до такой степени.

    По второму вопросу: на усмотрение планировщика. index merge mysql умеет, но это может быть дороже поиска по одному индексу и дальнейшей фильтрации.
    Ответ написан
    Комментировать
  • Почему выдаёт ошибку MYSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Покажите show create table orders
    Наиболее вероятная причина - в orders поле указано unsigned, а знаковое и беззнаковое число уже несовместимые типы для внешнего ключа.
    Ответ написан
    2 комментария
  • Какая особенность MySQL вызывает такую разницу в обработке запросов?

    Melkij
    @Melkij
    PostgreSQL DBA
    Посмотрите в explain, что планировщик думает по этим запросам. Есть большое подозрение, что хранимка и константный запрос идут по индексу по id, запрос с переменной - как-то иначе.

    Одна очевидная грабля:
    Значение переменной может изменяться во время выполнения запроса.
    Константное значение в запросе и аргумент хранимки - не могут.
    Соответственно моё предположение: глупый оптимизатор не смотрит, что в запросе переменная никак не изменяется, значит не может просто взять индекс по id и надо делать что-то другое. Скорей всего seq scan - судя по названию таблицы, данных подпадающих под условие dt <= дата куда больше, чем данных под него не попадающих. Для хорошей работы по индексу надо обратное свойство.
    Ответ написан
    3 комментария
  • Как на PHP или mysql запросом изменить названия полей сопоставив им нужные id?

    Melkij
    @Melkij
    PostgreSQL DBA
    Лучше в команды добавьте новое поле для id стадиона, всё равно ведь тип поля менять, а поле названия потом удалите. Когда проверите, что id заполнены верно и для всех строк.

    update команды join стадионы on стадион=стадионы.название set стадионid = стадионы.id
    Ответ написан
    Комментировать
  • Как хранить текущую дату и время в таблице mysql?

    Melkij
    @Melkij
    PostgreSQL DBA
    С самой таблицей вы можете делать всё, что угодно? Например, заменить её на вьюху?
    create view cur_time as select now();

    Дата будет вычисляться непосредственно при обращении к вьюхе.
    Только я не помню, как с вьюхами в mysql 4. Вроде должны быть.
    Ответ написан
  • Почему из базы MySQL самопроизвольно удаляются записи?

    Melkij
    @Melkij
    PostgreSQL DBA
    MyISAM

    баланс на моем сайте

    Сделайте мне это развидеть.

    Это безотносительно проблемы. Хранить данные и нетранзакционное хранилище - взаимоисключающие вещи. Используйте единственное транзакционное хранилище в mysql - innodb. И добавьте внешние ключи.

    Несколько маловероятно, что это непосредственная проблема, в штатном режиме даже myisam выборочно строки терять не должен так, что это заметил только конкретный пользователь. Более вероятна реакция mysql "аааа, таблица повреждена, я буду говорить только с админом". Впрочем, я давно уже не работал с myisam в продакшене, может и такое поведение тоже характерно.
    А вот FK в режиме restrict вполне поможет от странных запросов.
    Ответ написан
    Комментировать
  • Как составить запрос MYSQL? Кто может помочь?

    Melkij
    @Melkij
    PostgreSQL DBA
    select u.id, u.login
        coalesce(income.sum, 0) - coalesce(payment.sum, 0) as balance
        from users u
            left join (
                select user_id, sum(money) as sum from moneyuser group by user_id
            ) income ON u.id = income.user_id
            left join (
                select user_id, sum(money) as sum from payments group by user_id
            ) payment ON u.id = payment.user_id


    left join и coalesce сделаны намеренно для корректного учёта пользователей, у кого ещё не было дохода либо выплат. Если нужно исключить пользователей, которые вообще ничего не делали, то допишите
    where payment.user_id is null and income.user_id is null
    Ответ написан
    3 комментария
  • MYSQL количество ядер или мощность ядра?

    Melkij
    @Melkij
    PostgreSQL DBA
    Смотря для чего именно.
    Обработка одного запроса только однопоточная. Запросы по разным соединениям могут исполняться параллельно, т.е. утилизировать многоядерные CPU. Если не подерутся за блокировки между собой, конечно.

    Обработка потока репликации - однопоточная до 5.7. Многопоточный слейв вообще-то запилили в 5.7, вот только он стал заметно медленнее в целом...
    Я лучше сошлюсь на прошлогодний pgday и конкретно вот эту презентацию от mail.ru: pgday.ru/files/papers/2/pgday.2015.oleg.tsarev.pdf и запись доклада: https://www.youtube.com/watch?v=y8P-IWwzacY&index=...
    Просто цитата оттуда для затравки: "Четыре потока 5.7 работают примерно как 5.5". В 5.5 реплика однопоточная.
    Ответ написан
    Комментировать
  • Group by в mysql версия 5.7?

    Melkij
    @Melkij
    PostgreSQL DBA
    Пропишите в конфиг. dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-...

    И группировкой пользоваться всё так же можете. Но теперь группировка должна быть написана нормальным, стандартным способом, а не абы как, как ранее mysql позволял.
    Ответ написан
    Комментировать
  • Как объединить два запроса?

    Melkij
    @Melkij
    PostgreSQL DBA
    (
        select ...
    )
    union all
    (
        select ...
    )
    limit 1

    В общем случае.

    Какое-нибудь в частном:
    FROM statya s
    WHERE s.del = 0
    AND s.raz_id = 1
    AND s.langid = 1
    s.st_date IS NOT NULL and s.st_date < 1234567890
    order by if (s.st_date > 1234567890, s.st_date, 0), s.st_date DESC
    limit 1
    Ответ написан
    Комментировать
  • Какую книгу посоветуете на тему написания хранимых функций/процедур в SQL (MySQL)?

    Melkij
    @Melkij
    PostgreSQL DBA
    MySQL и хранимки...
    Совет: используйте или mysql или хранимки, но не то и другое сразу.
    Планировщик запроса не умеет считать косты на вызов хранимки, вызов хранимки провоцирует безусловный commit - вот две серьёзные причины обходить хранимки в mysql стороной.

    Книгу подсказать не смогу, мне хватает вышеизложенных доводов, а когда приходится сталкиваться - то официальной документации и гугла.
    Ответ написан
    Комментировать
  • Транзакции БД и запись на диск?

    Melkij
    @Melkij
    PostgreSQL DBA
    если я хочу гарантированные true транзакции то мне надо ставить только 1?

    Да.
    И надо бы учитывать что это только то, на что может повлиять СУБД - т.е. вызвать fsync. Нижележащие ОС и железо могут не осуществлять реальную запись данных при ответе на fsync. Обычно fsync честный, но это стоит проверять или в документации (к рейд-контроллеру, например) или у гугла или синтетикой (результаты бенчмарков на разных innodb_flush_log_at_trx_commit должны различаться существенно)

    Значения 0 и 2 - данные о коммите транзакции в WAL могут не успеть записаться на диск и при восстановлении базы эти транзакции будут отменены. Ведь если в WAL нет данных о коммите - как СУБД понять, была транзакция закоммичена или авария случилась ещё до коммита и транзакция была прервана?
    Ответ написан
    Комментировать
  • Как организовать хранение большого количества данных?

    Melkij
    @Melkij
    PostgreSQL DBA
    5,5 лямов записей в год?
    За десять лет смешные 55 лямов? Право, какая фигня. Даже для mysql. С чего вы взяли, что это - большие данные? Вот 50 лямов ежедневно - уже можно с натяжкой большими данными назвать.

    Две таблицы:
    id name и чего ещё надо для самой сущности.
    date, entity_id, low, middle, high. Можно партицировать поквартально.
    Ответ написан
    1 комментарий
  • Как сделать INSERT в две таблицы?

    Melkij
    @Melkij
    PostgreSQL DBA
    MySQL?
    Невозможно.

    Атомарно - возможно. Одним запросом - нет.
    Ответ написан
    Комментировать
  • Как найти значение в serialize массиве?

    Melkij
    @Melkij
    PostgreSQL DBA
    Приведите хранение данных в нормальную форму. И будет вам простой и быстрый поиск на уровне субд.
    Ответ написан
    Комментировать
  • Как составить запрос к mysql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Нормализуйте свою таблицу с ключевыми словами.

    Теперь решение элементарно: разбиваете входную строку по разделителю на приложении, загоняете в запрос:
    select id, count(0) as match_count from tablename
    where keyword in (...)
    group by id
    order by match_count desc

    Всё, готовый отсортированный список id.
    Ответ написан
    7 комментариев
  • Как подсчитать активность пользователя за промежуток времени по данным из БД?

    Melkij
    @Melkij
    PostgreSQL DBA
    select curr.user_id, (curr.exp - coalesce(lastr.exp, 0)) as diff
    from user_exp curr
    left join user_exp lastr ON curr.user_id = lastr.user_id and lastr.date = CURRENT_DATE - interval '1week'
    where  curr.date = CURRENT_DATE
    order by diff desc

    По индексу по user_id & date будет внятно работать джойн, индекс по date для начальной таблицы. Но сортировка всех юзеров по вычисляемому полю - это может быть болезненно.
    Ответ написан
  • Почему PDO выдает ошибку?

    Melkij
    @Melkij
    PostgreSQL DBA
    При чём тут PDO, если ошибку вам отдаёт MySQL?

    Синтаксис оператора SOME: dev.mysql.com/doc/refman/5.7/en/any-in-some-subque...
    operand comparison_operator SOME (subquery)

    У вас перез some ни операнда ни оператора. Парсер закономерно удивляется. Судя по месту ошибки, парсер посчитал SOME именем столбца.

    Что вы хотели получить этим условием?
    Ответ написан