Задать вопрос
Ответы пользователя по тегу MySQL
  • Как сделать кастомный 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 запросы работают и у них диапазон возможностей гораздо шире. Пусть кешируют. Пусть
    больше логики переносят на приложение.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Делаешь такой шаблон
    SELECT * FROM `wp_s3cu_authorization_logs` WHERE 1=0

    а потом к нему добавляешь строки. Если был активирован флажок windows - то добавляешь строку
    OR os_id = 'windows10'
    Ответ написан
    Комментировать
  • Как сделать поиск данных из mysql которые сохраненны в формате unicode?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Эта строка просто не работает.
    $where .= " AND {$table_prefix}`{$this->search_by}` LIKE '%{$this->search}%'";
    Ответ написан
  • Как правильно сделать сортировку в таблице базы данных?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Приоритет и две даты можно конвертнуть в строки и конкатенировать. Только следи за тем
    чтобы лексикографический порядок соблюдался. Если честно непонятно что тебе дает это
    объединение. Сортировки и для трех нормально работают.

    UPD: Я обновлю свой ответ на основе новых данных.
    Менеджеры хотят в приложении задачи перетаскивать

    Если это наподобие двигания тасок в JIRA-borad то тогда действительно не нужны
    никакие даты. Нужно одно поле rank. Возможно поле priority это оно и есть.

    Тогда при накидывании тасок на доску мы просто делаем им sequence с любого
    стартового значения. А когда менеджер двигает - нам нужна процедура
    swap(id1, id2)
    которая просто меняет ранги местами для двух JIRA ids.
    Ответ написан
  • Равноценно ли использование MariaDB вместе MySQL?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Для учебных задач тебе будет почти безразлично. Можешь ставить MariaDb.
    Ответ написан
    Комментировать
  • Как довести созданную БД до рабочего состояния?

    mayton2019
    @mayton2019
    Bigdata Engineer
    MySQL Workbench Community edition. Я быстро сделал все необходимые таблицы и создал связи, как нас учили, осталось только экспортировать ее для того, чтобы с ней можно было работать, но почему-то я совсем не могу понять, как это сделать.


    По данным обрывочным сведеньям невозможно сделать анализ ошибки. Опиши что ты делал по шагам.
    Процесс экспорта в MySQL начинается с

    $ mysqldump ....

    Покажи консоль. Покажи спул. Покажи какого размера получились файлы. Что внутри? Должны быть
    текстовые скрипты внутри (это важно потому что некоторые dbms под экспортом или дампом или бэкапом
    подразумевают вообще другие вещи).

    Мне кажется ты рыспыляешся и бежишь впереди паровоза. Тебя просили сделать одно а ты сам себе написал
    нефункциональные требования и выбрал dbms и словил кучу ошибок.

    Хочешь совет опытного? Если забуксовал больше 1 дня на технологии - выкинь ее. Возьми Excel или Access.
    Твоей маме будет безразлично а тебе - проще. Короче реши что тебе надо на самом деле. Изучать новые
    dbms или помогать родственникам.
    Ответ написан
    Комментировать
  • Как получить непересекающиеся строки между двумя запросами с group by?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Используй except:
    select * from ....
    except
    select * from ....
    Ответ написан
    Комментировать
  • Как сравнить данные двух mysql баз и внести изменения?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Импортируй первую базу во вторую. А потом вторую в первую.
    Ответ написан
    Комментировать
  • Как установить максимальное количество строк в таблице?

    mayton2019
    @mayton2019
    Bigdata Engineer
    По постановке это похоже на буфер очереди сообщений. Вам нет смысла синхронно удалять хвостовые строки.с
    Пускай это делает отдельный джоб раз в сутки например. Вам - же не принципиально если пол дня табличка будет в 1001 строку?

    А консистентный снимок top 1000 строк вы всегда можете получить запросом с сортировкой и лимитом. И это будет решение в духе баз данных а не Java-буферов с блокировками.
    Ответ написан
  • Mysql постоянно отваливаеться, to many connection, connection refused, как оптимизировать?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Скорее всего неверно написанное приложение. По хорошему надо использовать пул коннектов и тогда БД не будет видеть такие ошибки. Но возможно другая ситуация когда сессии будут долго ждать освобождения нового объекта connection из пула. А почему он долго не освобождается - это еще один вопрос. Видимо у вас - длинные транзакции. Этого надо избегать. Короче проблема комплексная и надо смотреть "как было раньше" и "что изменялось". Хорошая идея откатить версию комплекса на 1 шаг назад чтобы просто посмотреть что действительно проблемы на было и в новой версии она возникла. Не думаю что хостинг тут сильно виноват.
    Ответ написан
  • Какое ваше отношение к таблицам с внешним ключам с NULL значением?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В более крупном масштабе это не работает. В географических справочниках и классификаторах есть одна
    проблема. Адресная строка - неформализуема.

    В разных странах и государствах после уровня страны например не всегда идут города или области. Там могут
    быть более сложные объекты (федеральные земли, периферии). И хуже того они могут стоять на разных уровнях. Улицы одного города могут внезапно иметь двойников (после слияния поселков к примеру). Могут быть улица Ленина, проспект и бульвар и переулок того-же имени.

    Вобщем если вы хотите иерархию - то можно делать иерархию. Но нельзя гарантировать жесткую типизацию для какого-то уровня. И с уникальностью - косяки.
    Ответ написан
    2 комментария