Ответы пользователя по тегу MySQL
  • Можно ли написать SQL запрос с выражением в WHERE и в SELECT, но без повторения этого выражения и без вложенного SELECT?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В SQL - много таких особенностей. Тоже самое с group by и оконными фунециями. Надо много повторяющихся expressions написать.

    Попробуй еще так написать.

    WITH HT AS (
     SELECT `product_id`, MD5(`value`) AS myhash
      FROM modx_ms2_product_options
      LIMIT 10
    )
    SELECT * FROM HT WHERE `myhash` = 'e59253548ffcb090ecc0cd0944afd27f'
    Ответ написан
    Комментировать
  • Стоит ли добавлять index для полей таблицы EAV?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Стоит ли добавлять index для полей таблицы EAV?

    Добавляй конешно. Если ты уже докатился до такого состояния что затащил EAV.
    Но это - вопрос не к Qna а к тебе. Ни один архитектор не умеет прогнозировать время
    исполнения запроса. Это - слишком шумящая и слишном сложная формула. А знать ее можешь
    только ты сам после нагрузочного тестирования. Загрузи фейковые данные. Смоделируй без индекса
    и с индексом.

    Ну... по возможности подумай о том чтоб как-то уйти от EAV и заменить характеристики
    товара JSON-документом.
    Это - эволюционный путь и все к этому приходят.
    Ответ написан
    4 комментария
  • Зачем именно нужны связи в бд?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Нужно поговорить об аномалиях. Например в твоей системе я могу (теоретически) добавить месседж
    который не принадлежит ни одному пользователю системы. Я просто сделаю

    insert into message(9999999, -1, "Mua-haha...");

    И у меня есть пост от анонимоса который не зарегистрирован как пользователь.

    Разумеется можно полагаться на логику твоего приложения и думать что такая ситуация невозможна
    но с точки зрения БД она вполне возможна потому как родственная связь User + Message нигде не объявлена.
    И SQL позволяет это сделать.

    Чтоб поправить ситуацию надо эту связь добавить и тогда я не смогу создать фейковые посты от анонимосов.
    ALTER TABLE Message
    ADD FOREIGN KEY (userid) REFERENCES users(id);

    По умолчанию констрейнт создается с опцией restict (это было в Оракле как в Майскл - не знаю)
    и это гарантирует что невозможно также удалять родительские записи пока есть дочки.
    Для скорости ссылочные ключи всегда - индексированы.

    Рассуждать на тему вреда от аномалий - это просто терять время. Каждый владелец БД сам решает
    какие уровни строгости ему вводить. Вообще любая теория касаемая БД - по сути просто развивает
    идею строгости НФ1,2,3,4,5,6 и ссылочных ограничений.

    Будет ли виден пост от анонимосов - это тоже другой вопрос и он не имеет отношения к обсуждаемой
    теме. Ведь тема касается именно логичности данных в БД а не тем методам которые их отображают.

    По сути вопрос сводится к тому как не создавать мусор в БД.
    Ответ написан
    2 комментария
  • Как испровить медленный запрос к базе данных?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Из быстрых советов - проверь что Subdivision_ID проиндексирован.
    Ответ написан
    Комментировать
  • Как убрать binlog mysql?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Для начал посмотри что в них внутри. Вот как тут пишут https://dev.mysql.com/doc/refman/8.0/en/mysqlbinlo...
    Может это и не ты накрутил а просто новая версия прикладного софта работает. Что-то обновляет интенсивно.
    Ответ написан
    Комментировать
  • Большая БД, лучше разместить данные в другой базе или таблице?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тут - невозможно ответить лучше или хуже. Если в базе нет проблем от ее
    размера - то пускай себе исторические данные лежит в основной базе.

    Если трудно делать backup - то можно поместить в другую БД. Но тогда нужно придумать
    новое техническое задание на поиск в друх базах сразу.

    Если просто медленно работает поиск - то можно сделать partitioning по периодам (годы, кварталы или месяцы)
    и попросить программистов сделать настройку запросов с учотом partitioning.
    Ответ написан
    Комментировать
  • Можно ли сделать дамп MySQL БД из консоли Linux, исключив из него определенные поля определенных таблиц?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Скорее всего такого готового функционала нет. Но любой думающий девопс или dba сможет
    сделать семейство скриптов которые делают полный экспорт во временную базу и потом
    в этой временной БД делают drop column ... или лучше update set = null. И еще раз полный
    экспорт в файлы.

    Эти скрипты вобщем делаются быстрее чем мы здесь сидим и обсуждаем. Поэтому
    не ждите. Начинайте делать.

    UPD:
    Ответ написан
    2 комментария
  • 1 или 2 сущности для регистрации?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    Если они связаны 1:1 то соедини их в одну табличку и все.

    UPD: Автор если ты сомневаешся - то лучше не делай. На все технические вопросы тут ответят.
    Но риски - это дело твоё. Похлопывать тебя по плечу или давать санкции на авантюры - никто не будет.
    Если ты отвественный за БД и уверен в себе - то иди и делай.
    Ответ написан
    Комментировать
  • Можно ли переносить данные базы данных через phinx?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Типа можно накатить изменения и также безопасно откатить.

    По поводу безопасного отката. Это на 99% зависит от SQL кода который вы напишете. Это никак не связано с фреймворком поддержки миграций. Берите какой угодно фреймворк. Например liquibase или flyway.

    И даже в них если во время alter table rename column вы столкнетесь с активными сессиями в БД - то ваша транзакция переименования упадет и вы будете вручную решать ситуацию отката или наката.

    Безопасность наката и отката также зависит от грамотности описания ваших чендж-сетов. Бывает так что в 1 чендж-сет запихивают 2 DDL команды и одна из них проходит а вторая не проходит и фреймворк повисает навсегда в клинче. Двигаться назад он не может т.к. Не был применен чендж-сет. И двигаться вперет тоже не может т.к. первая DDL команда уже выполнена и повторо ее вызывает ошибку типа "table/index already exists".

    Выводы - грамотность описания чендж-сетов. И все.

    Ваш фреймворк phinx выглядит ужасно с точки зрения кода. Как по мне он не делает главной задачи а именно - не является DSL для upgrade/rollback. Он - прибит гвоздями к PHP и следовательно его можно рассматривать только под углом вашего PHP-удобства. Удобен он вам? Используйте.
    Ответ написан
    Комментировать
  • Что лучше, по одной или несколько записей при INSERT?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Имеется система логов, которая довольно часто вызывается, при пиковых значениях достигает до 30-40 записей в секунду. Использую engine ARCHIVE, сервер MariaDB, подключение по unix сокету.

    Имеет ли смысл собирать кучу данных допустим 50 записей и потом одним запросом добавлять 50 записей.

    Смотри. Писание логов в Марию - это как по мне лишнее. Оверинжинеринг. В наше время логи собирают logstash-ем и пишут в Кибану. Там для каждого формата есть свой парсер. Для Ninx, Apache e.t.c.

    Если тебе прям сильно-сильно надо писать логи в реляционную систему (очевидно что-то джойнить с логами) - то пиши максимально большой пачкой. Хоть 1000 штук. Сколько позволяет размер фрейма в этом unix socket. (Кстати какой он там?) А чорт его знает. Но.... если ты записал 999 записей а последняя еще не пришла, а тебе срочно нужно глядеть в базу - тогда делай периодически сброс по времени. Например через 3 секунды от начала пачки ты будешь делать insert независимо от того сколько строк накопил.

    Вот так.
    Ответ написан
    Комментировать
  • Есть способ с помощью Mysqli одним махом засунуть JSON в базу?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Варианты. Можно преобразовать JSON в JSON-Lines (где каждая строчка - это независимый JSON документ представляющий строку таблицы).

    Потом загрузить это в spark dataframe
    Using Scala version 2.12.15 (OpenJDK 64-Bit Server VM, Java 11.0.17)
    Type in expressions to have them evaluated.
    Type :help for more information.
    
    scala> val df1 = spark.read.json("/tmp/emp.json")
    df1: org.apache.spark.sql.DataFrame = [_corrupt_record: string]

    И имея фрейм либо сохранить в CSV либо подключить драйвер JDBC записать прямо в базу.

    Еще во фреймворке Pandas есть опции загрузки из JSON. Но я сам не спец в пандасе поэтому
    точно как сделать не скажу.

    Вот. Еще я помню где-то писал утилиту чтоб произвольные JSON конвертить в JSON-lines.

    Короче способов - масса. Беда как обычно в вопрошающем. Что он готов для этого установить
    и что выучить.
    Ответ написан
    Комментировать
  • Как сделать массив int в таблице?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Массив можно сделать через JSON тип. По крайней мере MariaDb его поддерживает. Может и MySQL тоже имеет.

    Хранить его в пользователе я-бы не советовал. Лучше создать отдельную таблицу типа sessions или какие-то юзерские активности и складывать туда связку session_id + user_id + JSON с корзинкой. Причем добавить обязательно TTL хотя-бы на неделю. Чтоб рассеянные пользователи не заполняли мусором таблицу.
    Ответ написан
    Комментировать
  • Как узнать позицию записи в базе?

    mayton2019
    @mayton2019
    Bigdata Engineer
    База это не Excel лист. И записи в таблице БД хранятся разбросанные в случайном порядке. Порядок появляется когда мы делаем SELECT c order by. В остальных случаях порядок не гарантирован.
    Ответ написан
    1 комментарий
  • Как сделать запрос в запросе в SQL?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Order by стоит не там. Вообще если хочешь в одном SQL запросе использовать несколько изолированных - то
    попробуй Inline Views (или еще их называют common table expressions). Типа такого

    WITH T AS (SELECT * FROM EMPLOYEE WHERE dept = 'Sales')
    SELECT * FROM T WHERE name = 'Ava';
    Ответ написан
    Комментировать
  • Как создать порядковый номер для заказа конкретного заведения?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Откажитесь от порядкового номера. Создайте код типа номер заведения + дата-время. И это будет коробочное решение вашей проблемы.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Скорее всего тебе нужно 2 таблицы. Users и Tasks. Вторая - дочерняя и таким образом у одного юзера есть несколько тасков или ни одной.

    Это называется Нормализация БД.
    Ответ написан
    Комментировать
  • Что быстрее: select и update или просто update?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Делай просто update. Проверка не нужна.
    Ответ написан
    Комментировать
  • Какой приоритет у OR?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если не знаете приоритет - то всегда можно поставить скобки. Это решает проблемы и не несет накладных расходов.
    Просто код становится на 2 символа длиннее.

    SELECT ..... FROM .... WHERE (CODE: `id` = value OR `code` = value) .... other predicates....


    Update:

    Если тебе надо гарантировать что поле не пустое - то добавь еще один предикат IS NOT NULL.
    Ответ написан
    9 комментариев
  • Почему много промахов в кэш MyISAM, когда в БД только InnoDB?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я не понимаю. Расследование инцидента в БД так не делается. Нельзя прийти с утра и, посмотрев в промахи Кеша делать выводы. В любой крупной БД промахи есть.

    По хорошему, надо из жалоб клиента попытаться понять root cause. Тот самый запрос который вчера работал быстро а сегодня тормозит и должен быть исследован.
    Ответ написан
    Комментировать
  • Как при вставке из одной таблицы в другую автоматически пронумеровать повторы?

    mayton2019
    @mayton2019
    Bigdata Engineer
    2я таблица - должна быть view по отношению к первой.
    Ответ написан
    Комментировать