Ответы пользователя по тегу MySQL
  • Как сделать сортировку SELECT FROM SELECT с последними состояниями устройств?

    Melkij
    @Melkij
    PostgreSQL DBA
    Ошибка в том, что так делать вообще нельзя. Даже этот странный mysql актуальный версий при дефолтном sql_mode откажется такое выполнять.

    Если порядок событий допустимо считать по старшинству id:
    select /**/ from `object_log`
        join (
            select max(id) as id 
                from `object_log`
                group by `id_gsm`
    ) lastevents using(id)
    ORDER BY `id_gsm` ASC
    Ответ написан
    Комментировать
  • Влияет ли директива "max connections" в mysql на работу нескольких сайтов расположенных на одном сервере?

    Melkij
    @Melkij
    PostgreSQL DBA
    https://dev.mysql.com/doc/refman/5.7/en/too-many-c...
    If you get a Too many connections error when you try to connect to the mysqld server, this means that all available connections are in use by other clients.


    "Too many connections" является следствием превышения директивы max connections
    Количество сайтов, серверов или других клиентов базы с этим никак не связано. Хотя помогает быстрее в этот лимит упереться.
    Ответ написан
    2 комментария
  • Разница в индексах mysql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Составной индекс должен быть именно age_country, а не наоборот.

    Как раз наоборот.

    mysql обычно использует подвид btree. У btree поиск левосторонний, т.е. по индексу age & country можно обрабатывать запросы по age. А по индексу country & age искать только age уже нельзя.

    И какова разница между индексом age_country и отдельно двумя индексами для age и для country?

    Вы ищете пользователей некоторой страны с возрастом от 25 лет.
    Перед вами справочники:
    0) пользователи отсортированы по возрасту (в пределах одного возраста - вперемешку) - вам достаточно пролистать до начала 25 лет, а дальше вчитываться в каждого пользователя и искать нужную страну. Справочник вам не поможет в этом. Индекс age
    1) пользователи отсортированы по стране. Вы быстро находите всех из нужной страны, а затем вчитываетесь в каждого пользователя и смотрите возраст. Индекс country
    2) пользователи отсортированы сначала по возрасту, в пределах одного возраста дополнительно отсортированы по стране. Быстренько листаете до 25 лет, в пределах каждого возраста листаете до нужной страны. Как-то не очень удобно? age & country
    3) пользователи отсортированы по стране, пользователи одной страны отсортированы вдобавок по возрасту. Быстренько листаете до нужной страны, быстренько пропускаете всех младше 25 лет - читаете остаток, поглядывая только, что страна не изменилась. country & age

    Какой справочник захотите использовать?
    А если я скажу, что в справочнике помимо сортировки других данных пользователя нет? И чтобы по индексу country уточнить возраст пользователя вам необходимо посмотреть id человека и сходить за остальными данными в картотеку?

    Вы можете взять справочник по стране, переписать все id людей, затем взять справочник по возрасту, и поискать в диапазоне от 25 лет записанные id людей. Потратите много сил на сравнение, не так ли? Вот и mysql умеет index intersect, но операция эта не бесплатная.
    Ответ написан
    Комментировать
  • Как пользоваться SET в Mysql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Суть типа данных set - 64-битная битовая маска со встроенным человечным именованием значений.
    Желаемый фильтр делается условием:
    where FIND_IN_SET('доставка2', delivery_type) or FIND_IN_SET('доставка3', delivery_type)
    Ответ написан
    Комментировать
  • Как подготовить запрос SQL в PHP?

    Melkij
    @Melkij
    PostgreSQL DBA
    - $sql = 'SELECT * FROM items WHERE item_name LIKE %:query%';
    + $sql = 'SELECT * FROM items WHERE item_name LIKE :query';
    - $result->bindParam(':query', $query, PDO::PARAM_STR);
    + $result->bindParam(':query', '%'.$query.'%', PDO::PARAM_STR);

    И проверьте свой PDO::ATTR_ERRMODE. Должен быть PDO::ERRMODE_EXCEPTION
    Ответ написан
  • Как организовать выборку из таблицы MySQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    По разному можно поизвращаться. Например,
    select /**/ from tablename join (
        select id_client, max(next_talk_date) as last_date from tablename where id_client in (/**/) group by id_client
    ) lastdate using(id_client)
    where id_client in (/**/) and next_talk_date >= CURRENT_DATE and (next_talk_date = last_date or next_talk_date > CURRENT_DATE)

    По индексу id_client & next_talk_date должен бегать внятно.

    Или так:
    select /**/ from tablename t
    where id_client in (/**/) and (
        next_talk_date > CURRENT_DATE or not exists (
            select 1 from tablename n 
            where n.id_client = t.id_client and n.next_talk_date > t.next_talk_date
        )
    )
    Ответ написан
  • Как безопасно дописать в базу?

    Melkij
    @Melkij
    PostgreSQL DBA
    update tablename set fieldname = concat('prepend', fieldname) where /**/;
    Ответ написан
    Комментировать
  • Как укоротить запрос mysql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Никогда не смешивайте OR и AND в одном предложении без выделения своих намерений скобками явно.

    WHERE 
            uid IN (1,2,3,4,5) AND reg IN (1,2,3) AND date_last < SUBDATE(CURRENT_DATE, reg)


    Ну или длинно:
    uid IN (1,2,3,4,5) AND (
            (reg=1 AND date_last < NOW() - INTERVAL 1 DAY)
            OR
            (reg=2 AND date_last < NOW() - INTERVAL 2 DAY)
            OR
            (reg=3 AND date_last < NOW() - INTERVAL 3 DAY)
    )
    Ответ написан
    Комментировать
  • Как найти конфиг mysql?

    Melkij
    @Melkij
    PostgreSQL DBA
    max_connections

    Где mysql ищет свои конфиги:
    mysql --verbose --help
    Вам нужен фрагмент вывода вроде такого:
    Default options are read from the following files in the given order:
    /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
    Ответ написан
  • Кол-во строк затронутых запросом при постоянном соединении MySQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    MySQL и PDO.
    Если вы только не настраивали специально что-то очень странное, то пул постоянных соединений поддерживается не в режиме statement based, а в режиме session based - соединение выдаётся запросившему его процессу монопольно и пока процесс не отпустит соединение сам (например, завершится), это соединение не будет предоставлено никакому другому процессу. Запросы других процессов через это соединение выполняться не будут, даже если соединение простаивает.

    Что делать с умирающими скриптами - а уверены, что что-то надо делать? mysql архитектурно заточен легко и быстро открывать-закрывать соединения. (в отличии от postgresql того же, в котором без стороннего пулера коннектов жизни можно сказать и нет). Зато нет граблей с случайно зависшими транзакциями.

    php.net/manual/en/features.persistent-connections.php
    Persistent connections were designed to have one-to-one mapping to regular connections. That means that you should always be able to replace persistent connections with non-persistent connections, and it won't change the way your script behaves. It may (and probably will) change the efficiency of the script, but not its behavior!
    Ответ написан
  • Как считается key_len в команде EXPLAIN MySQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Показывается используемая длина ключа в байтах.
    INT - 4 байта и есть. И длина int'а всегда 4 байта, та циферка в скобках - ни на что не влияет в плане хранения, используется в некоторых клиентах для выравнивания отображения таблицы и только.
    Ответ написан
    1 комментарий
  • PDO SQL QUERY PHP5?

    Melkij
    @Melkij
    PostgreSQL DBA
    pdo::query false вернуть может в одном случае: у вас PDO::ATTR_ERRMODE установлен в неверное значение. Установите его в нормальный PDO::ERRMODE_EXCEPTION.
    Ответ написан
  • Как найти в БД все совпадения строки и удалить их?

    Melkij
    @Melkij
    PostgreSQL DBA
    Задача одноразовая? Сделайте на своём любимом языке программирования.

    Замену регулярками mysql не умеет, можно поизвращаться строковыми функциями, в конце концов возможно написать даже хранимку и задачу сделать, но смысл тратить порядком больше времени для одноразовой экономии каких-то крох машинного времени?
    Ответ написан
    2 комментария
  • Как удалить значения одного столбца из другого?

    Melkij
    @Melkij
    PostgreSQL DBA
    delete from foo where fieldname in (select filedname2 from bar)
    Ответ написан
    Комментировать
  • Как сделать так, чтобы при добавлении информации в базу использовались сразу все пользователи?

    Melkij
    @Melkij
    PostgreSQL DBA
    INSERT INTO pm (to,author,time,title,content) 
    SELECT id, :author, :sendtime, :title, :message
        FROM users

    В insert ... select сам select может быть любым, лишь бы в результате его выполнения было нужное число колонок и их можно было привести к требуемым типам данных.
    Ответ написан
    4 комментария
  • Как правильно работать с большими таблицами?

    Melkij
    @Melkij
    PostgreSQL DBA
    Как правильно работать с большими таблицами:
    положить в таблицу пару лямов записей. Посмотреть на размер этой таблички. Осмыслить, что это какая-то фигня, а не большая таблица. Положить ещё лямов 100.

    Вот теперь можно уже разбираться, а нафига вам вообще понадобилось вычитать всю таблицу?
    Что-то просуммировать? База это сделает быстрее и лучше и отдаст вам уже готовый аггрегат.
    Дёрнуть какие-то внешние вызовы ака очередь? А зачем вам вся таблица? Выбирайте N записей, ещё не обработанных и обрабатывайте их, пока очередной запрос не вернёт 0 записей.
    Ещё что-то?
    Выгрузить в csv для внешней аналитики? см ответ kifirch
    Ответ написан
    Комментировать
  • Как составить запрос YII2?

    Melkij
    @Melkij
    PostgreSQL DBA
    Соберите допустимые hashtags_mid.hash в массив и скормите его в один IN
    Если не изменяет память,
    ->where(['show'=>1, 'hashtags_mid.hash' => ['yii', 'три']])

    Сгенерирует верный запрос.
    Ответ написан
    Комментировать
  • Необходимо составить запрос postgresql, поможете?

    Melkij
    @Melkij
    PostgreSQL DBA
    Удалить все users с lastvisit NULL и create_time больше 3 суток назад?
    Ну и зачем так сложно?

    delete from users where lastvisit IS NULL and create_time < now() - interval '3 day'
    Ответ написан
    Комментировать
  • В чем смысл Prepared Statements MySQL если внешние данные идут в начале в запрос SET?

    Melkij
    @Melkij
    PostgreSQL DBA
    Потому что запросов SET в коде приложения нет. И запросы PREPARE и EXECUTE тоже напрямую не вызываются.
    Есть вызовы API, куда сначала в вызов prepare передаётся текст запроса, затем в execute по отдельному бинарному протоколу передаются данные.
    Ответ написан
  • Ошибка в запросе mysql?

    Melkij
    @Melkij
    PostgreSQL DBA
    SELECT t1.id AS company_id,
    (SELECT COUNT(*)
      FROM `sent`
            WHERE `list_id` IN (SELECT id from lists_prod where campaign_id = t1.id)
           ) AS count
          FROM companies t1 LIMIT 100;

    Шаг следующий - переписать в join с подзапросом.

    Если это надо делать часто - сделайте companies отдельное поле и сохраняйте туда count. Можно поддерживать актуальности триггерами, можно - периодически пересчитывать, можно что-то между этими двумя вариантами.
    Ответ написан
    Комментировать