Ответы пользователя по тегу MySQL
  • Как можно дать несколько условии(значение) в like например like ('%1%', '%2%' и тд)?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Можно попробовать механизм регулярок

    SELECT ....... WHERE REGEXP_LIKE(tranz_acct , '.*(99449872|23424232).*')

    но сравни производительность в обоих случаях. Обычно регулярки не могут использовать индекс.
    Поэтому будет FULL_TABLE_SCAN. В случае с like выражениями у тебя есть шанс пойти
    в план с INDEX_SCAN но нужно пересмотреть саму задачу. Откуда цифры.
    И можно ли во всех кейсах выделить общий префикс например.
    Ответ написан
    4 комментария
  • Как запросить по 2 записи из каждой категории с лучшим рейтингом?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Кажется можно решить через оконные функции. Посмотри как тут https://dev.mysql.com/doc/refman/8.0/en/window-fun...

    Пригодится RANK или LEAD.
    Ответ написан
    1 комментарий
  • Как скрестить ElasticSearch и MySQL?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В этом мало смысла потому как назначение Эластика - это делать быстрый поиск в не-структурированных
    (non-structured) данных таких как логи, дампы сетевого трафика или просто месседжи или текст.

    Назначение MySQL (процентов 99) это хранение реляционных данных. Тоесть данных где есть нормализация
    (1-2-3 НФ).

    И где... в какой части вы пересекаетесь - непонятно. Либо неправильно используется MySQL либо не там Эластик.
    Ответ написан
    2 комментария
  • Как выбрать строку по определенному числу?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Дружище, data quality у тебя ужасное. Такие данные не должны попадать в реляционную БД.
    Лучше их как-то подчистить и нормализовать. И потом и запрос по подчищенным данным пойдет
    быстрее и индекс можно построить.
    Ответ написан
    Комментировать
  • Почему строка таблицы mysql выводится 3 раза?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Все правильно. Такие данные.
    Ответ написан
    Комментировать
  • Как можно ускорить выполнение SQL запроса?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Можно материализовать. Перечислить все комбинации prop_id и создать такое представление

    prop_ids | responce
    ---------|---------
    '1,2,3'  | [ { "prod_001" : 200 }, { "prod_333" : 134 } , ..... ]
    '2,3,4'  | [.....]
    Ответ написан
  • Как сделать INSERT в две таблицы в одном запросе?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ты можешь открыть транзакцию и сделать два инсерта в разные таблички. И с точки зрения БД
    это будет иметь смысл атомарного действия.

    Или ты другое хотел?
    Ответ написан
    8 комментариев
  • Можно ли организовать фильтр/поиск товаров посредством JSON_EXTRACT?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я-бы переделал табличку. Пускай мета-данные по продуктам лежат в виде битовых полей.

    create table product(
      ....
      params_group1 BINARY(100),
      params_group2 BINARY(100),
      params_group3 BINARY(100)
    )


    И дальше булевыми (bitwise) операциями как тут пишут https://dev.mysql.com/doc/refman/8.0/en/bit-functi... делать поиски продуктов по маске свойств.
    Ответ написан
  • Какой способ хранения и выборки данных предпочтительней?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Нужно делать одну таблицу и с ней работать. Самый простой вариант - обычно самый надежный и долговечный.

    Игры с разными таблицами - это овер-инжинеринг. И ты зря занимаешся этим потому что в топике совершенно
    нет мотивации к этому. Пускай одна таблица работает и если она по каким-то причинам перестанет справлятся
    - то тогда можно рассмотреть materialized views, витрины, гиперкубы и прочие технологии. Но пока это
    все - не нужно.
    Ответ написан
    Комментировать
  • Как правильно создать БД в одном execute?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    Обычно БД создается во время процессов CD/CD через технологии liqubase/flyway.
    Таблицы тоже. В этом есть смысл потому что БД и таблицы это такие долго-живущие объекты
    и кроме того не лежащие в плоскости транзакций. Они - выше транзакций и их надо логически
    отделять от прочего java кода. А в java коде - оставить insert/update/delete.
    Ответ написан
    5 комментариев
  • Как сделать кастомный mysql запрос от пользователя?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Есть два варианта.

    Классифицировать все хотелки от пользователя и превратить их в набор формочек например

    Count: ___
    Names: ___

    И транслировать их в фиксированные запросы типа
    SELECT * FROM database WHERE count > _ AND Name IN (___,___)


    И второй вариант - дать пользователю конструктор запросов. Чтоб пользователь как-бы мышкой
    накликал набор предикатов-фильтров
    . Я не специалист в PHP, но в Java например такие конструкторы
    (билдеры) выглядят вот так https://www.jooq.org/ или так querydsl.com

    Все остальные варианты ты просто не потянешь в силу наверное слабого опыта. Сделать полноценную
    защиту от инжекций - сложно даже профессионалам. Это - вечная борьба в кошки-мышки. И тебе
    надо очень хорошо знать и DBMS и синтаксические парсеры чтобы хоть что-то полноценно там создать.
    И не просто создать и все время поддерживать. Быть в тренде обновлений DBMS и новых векторов угроз.
    Ответ написан
  • Как ускорить запрос Select живом поиске?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Select title from table where title Like % : title % limit 10


    runapa, есть разные пути как ускорить текстовый поиск. Человек в ответах верно написал что если
    ты включаешь лидирующий знак % то индекс не используется. Это правда. Классические индексы БД
    не умеют искать по середине выражения. Только по префиксу или по полному совпадению. Если сработает
    - попробуй переписать вот так.

    Select title from table where title Like : title % limit 10


    Если в поле title - ты постоянно ишешь какую-то категорию - то можно эту категорию выделить
    в отдельное поле и проиндексировать его и сделать его лидирующем в плане запроса.
    Тогда поиск будет выглядеть так.

    Select title from table where category='физ-лицо' AND 'title Like %: title % limit 10

    и фактическое время запроса будет уменьшено. Но это требует эксперимента.

    Если это все не помогло - то тогда почитай как в MySQL работает полнотекстовый поиск
    https://dev.mysql.com/doc/refman/8.0/en/fulltext-n... Это возможно потребует
    переделки всей таблицы. И переделки всех запросов.
    Не всем это подходит и не всегда оптимально. Поэтому делай эксперименты с замером времени.
    Текстовые индексы имеют побочные свойства. Они либо медленнее обновляются (неконсистентны)
    в отличие от B+Tree либо требуют ручных действий по обновлению.
    Ответ написан
    Комментировать
  • Как объединить запросы?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тебе можно вообще все три таблицы объединить в одну. И сделать partitioning by range по полю created.
    При такой архитектуре все запросы у вас пойдут в одну таблицу. А поле push_type станет просто ненужным.
    Или можете сохранить его чтобы различать бывшие типы строк push/push_actual.

    По partitioning - посмотрите примеры как тут пишут https://dev.mysql.com/doc/mysql-partitioning-excer...
    Ответ написан
  • Правильно ли я выбрал структуру базы данных, создав 2500 одинаковых таблиц?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Andrew_Novikov,

    Пользователь выбирает имя спортсмена, например "Petr_Yan", дальше идет запрос к БД "select * from Petr_Yan",

    нет-нет дружище так нельзя. Переделывай. Никто не создает по таблице на пользовательский
    запрос. Таблица - слишком дорогой ресурс чтобы ей так просто бросаться.

    Над таблицами думают. Их рисуют на архитектурных диаграммах. Ты чисто случайно словил
    дефект в различиях файловых систем Linux/Windows и мы пришли вообще к тому что ты
    сделал невернй дизайн БД.

    После того как переделаешь - проблема сама собой уйдет. А когда будешь придумывать
    имена таблиц - делай все в одном регистре. Так - проще жить. Меньше в будущем
    будет архитектурных косяков.
    Ответ написан
    6 комментариев
  • Как незаметно переползти на новый сервер?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Обычно поднимают балансировщик и делают так что сначала все ходят на 1.1.1.1.
    Потом делают перевод новых сессий в новое место в пропорции 20:80.
    И так далее пока все сессии не переползут.
    Ответ написан
    4 комментария
  • Как хранить большое количество json в mysql?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Когда обсуждают базу данных - то ее физический размер обычно не имеет значения. Она может быть и терабайт и пета-байт. Но важно подумать о том какие виды запросов вы будете там гонять. И какие индексы надо построить чтобы быстро искать нужный JSON.

    Хорошая коробочная поддержка JSON с индексами и бинарным представлением документа есть в Postgresql.
    Про MySQL я не в курсе. Но вот посмотрите эту статью https://habr.com/ru/companies/skillfactory/article...
    Может быть появятся мысли.

    Ваш вопрос требует создания POC + Benchmark. Безотносительно того что вам тут напишут в ответах - ваша
    задача создать прототип и загрузить туда 100К синтетических записей и понаблюдать как быстро MySQL будет
    делать поиск нужных значений.
    Ответ написан
    2 комментария
  • MySQL on duplicate key update. Как избавиться от увеличения ID?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Дырки могут быть связаны с механикой кеширования sequence для каждого сеанса mysql.
    По сути если 10 сеансов хотят быстро и без конкуренции вставлять в таблицу то они должны
    прочитать пачку номеров. Например первый сеанс с 1 по 10 и второй с 11 по 20 и так далее.
    В разных БД это реализовано по разному но это в целом - механика оптимизации скорости.
    И если сеанс закрылся и недочитал 7, 8, 9 номер то и хер с ним. Диапазон уже был использован
    как туалетная бумага.

    У тебя-же нет желания доставать из ведра грязную бумагу и еще раз ее использовать?
    Ответ написан
    Комментировать
  • Не работает INSERT INTO, почему?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Открой MySQL консоль и выполни эту команду с конкретными параметрами

    INSERT INTO `films`(`img`, `img_vertical`, `trayler`,`film_categories`, `name`, `state`, `sinops`, `roles`, `creators`, `awards`) VALUES (................


    Увидишь ошибку и пояснение. Предположительно там идет нарушение unique key либо констрейнта not null.
    Ответ написан
  • Как сделать в MySQL изменение поля строки через время?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ну вообще базы так не делают. Их стараются делать в стиле WORM (Write Once - Read Many).
    Вот. И долбить по таблице каждую секунду проверяя записи - это создавать нагрузку как майнер.
    А зачем эта нагрузка? Атмосферу зря нагревать.

    Вот пускай тот бизнес-процесс, который считывает поле suc - сам и обновляет и проверяет.
    Это будет рационально. А пока он не считывает - никаких проблем и нет. Данные лежат
    стационарно и не мешают.
    Ответ написан
    Комментировать
  • Можно ли реагировать на нагрузку mysql в реальном времени?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Проблему надо искать не в MySQL а в прикладном коде который эту нагрузку создает. Я так понимаю что это либо PHP либо Python либо Node приложение. Смотрите какой там размер пула коннектов. Допустим 20. Сделайте 10 и повторите наблюдение.

    Есть шаблоны ограничения нагрузки такие как Cirquit Breaker. Почитайте в этом направлении.

    Я пробовал включать лог медленных запросов

    Медленных может не быть. Если допустим это крупный магазин - то он может создавать тысячи мелких запросов которые в общей своей массе создают нагрузку но в категорию медленных все равно не заходят.

    хостер VDS включает троттлинг

    Это очень плохо. Зачем такой хостинг нужен. Это искажает картину анализа происходящего.
    Найдите другой хостинг. Или не покупайте виртуалки. Купите сразу MySQL как услугу. Может
    это будет дешевле стоить и обслуживаться проще.

    Можно ли как-то реагировать не аномальное возрастание нагрузки на mysql

    Реагировать должно само приложение. Разговаривайте с разработчиками. Они знают что за
    SQL запросы работают и у них диапазон возможностей гораздо шире. Пусть кешируют. Пусть
    больше логики переносят на приложение.

    Админ или девопс конешно может написать баш-скрипты которые отстреливают процессы,
    но какая с этого польза для бизнеса? Задача делается как раз для предоставления
    услуги
    . Вот надо и в этом направлении работать.
    Ответ написан
    Комментировать