Ответы пользователя по тегу MySQL
  • Какой тип для денежных данных?

    @Vitsliputsli
    Можно и float использовать, если вас не напрягает, когда вы добавляете 1 сатоши, а добавится 2. Прочитайте про числа с плавающей точкой.
    Как вариант использовать обычный int, decimal выглядит круто в базе, но в php вам придется использовать int и смысл decimal теряется.
    Ответ написан
  • Как стоит организовать хранение данных mysql?

    @Vitsliputsli
    То есть что условно лучше - огромная таблица с кучей строк или же большое количество таблиц в бд?

    Очень правильный вопрос, но преждевременный.
    С точки зрения нормализации, да и просто нормального написания запросов - одна огромная таблица с кучей строк. Для ускорения поиска по ней есть индексы.
    Когда эта огромная таблица будет создавать проблемы, будете эти проблемы решать. При нормальном железе ориентироваться можно на 1млрд строк, обычно на таком кол-ве производительность InnoDB очень сильно деградирует. Кол-во ориентировочное, т.к. многое зависит от длины строки; при короткой строке, невысокой нагрузке и возможности ждать, будет работать.
    Ответ написан
    1 комментарий
  • Почему телеграм бот отключается от БД после ночного простоя?

    @Vitsliputsli
    Так как соединение долго не использовалось, MySQL тупо его оборвал.
    Используйте для бота systemd unit с перезапуском при ошибке, ошибки бывают разные, пускай перезапускается автоматически. Хоть это и решит проблему, лучше все-таки разрывать соединение, если оно долго не используется. Или, на худой конец восстанавливать его при обрыве.
    Ответ написан
    Комментировать
  • Как сделать запись на основе предыдущей?

    @Vitsliputsli
    Для описанного сценария можно использовать lock таблицы. Либо пусть все это обрабатывает 1 сервис и хранит текущую строку в памяти - это будет эффективнее. Т.е. приходит запрос, его кладем в очередь (какой-нибудь брокер сообщений), наш сервис в фоне забирает сообщение из очереди и из него и строки в памяти формирует новую строку, отдает ее опять в очередь, изначальный запрос забирает данные из очереди.
    Если я правильно понял, что в принципе нельзя обрабатывать параллельно.
    Ответ написан
    1 комментарий
  • Как mysql/mariadb сортирует одинаковые значения?

    @Vitsliputsli
    Они не будут сортироваться, т.е. будут взяты, как прочитаны. Порядок при чтении зависит от движка, если говорить про InnoDB, то в нем данные сортированы по первичному ключу. Этот порядок зависит лишь от внутренних механизмов движка и не гарантируется, расчитывать на него и использовать в ПО нельзя.
    Ответ написан
    Комментировать
  • Какой стэк использовать для быстрого доступа данных?

    @Vitsliputsli
    Оптимизация это всегда жертва чем-то, ради чего-то. Нельзя просто оптимизировать, нужно выбрать, что улучшать, а затем выбираеть решения, понимая, чем можно пожертвовать. Поэтому начинать оптимизацию нужно тогда, когда знаешь какую проблему решаешь.
    Нельзя просто поставить прослойку перед MySQL и все станет хорошо, MySQL итак, очень быстрая СУБД. Но можно поставить, например кеширующий Redis, при условии, что у вас очень много key-value значений и крайне важен быстрый доступ к ним. Это решение не только увеличит занимаемое место и усложнит архитектуру, нужно будет контролировать консистентность баз данных, которая может быть нарушена из-за проблемы инвалидации кеша.
    Оптимизация классических СУБД всегда начинается с построения наиболее подходящих индексов. Если этого уже не хватает и скорость чтения недостаточна, то можно ввести репликацию slave и читать из нее. Здесь опять возникнет вопрос дополнительных затрат на место и консистентности, особенно неконсистентности данных из-за лага репликации. Плюс затраты на дополнительное подключение, что впрочем можно решить внедрением proxy.
    Далее более сложные варианты, от отказа от foreign keys, до шардирования. Но все это при действительно высоких нагрузках, заниматься этим на данном этапе не стоит, разве что, если есть предпосылки, что к этому придете, то заранее выбрать параметр шардирования (иногда это просто, а бывает очень сложно).
    Ответ написан
    Комментировать
  • Что быстрее поиск по файлу JSON в PHP или в базе посредством MySQL?

    @Vitsliputsli
    Если это обычный вопрос, что лучше, то храните в БД. Если реально пытаетесь выиграть несколько миллисекунд, то положите это все в redis.
    В принципе, хранение в массиве php скорее всего тоже будет достаточно быстрым, при условии использования php-fpm и без json.
    Если нужен поиск подстроки в строке, то на таких объемах тоже вполне быстро будет работать. На больших придется рассматривать, что-то вроде Elastic, т.к. СУБД это делают плохо, а MySQL очень плохо.
    Ответ написан
    Комментировать
  • Выбор базы данных для быстрой записи меняющихся данных?

    @Vitsliputsli
    Это не должно быть проблемой для Mysql, это очень быстрая СУБД. С учётом, что это временные значения, которые не нужно хранить постоянно, то и классическая СУБД не нужна. Поэтому берите Redis. А Clickhouse это аналитическая СУБД, это здесь вообще не причём.
    Ответ написан
    Комментировать
  • Mysql Хранение в оперативной памяти?

    @Vitsliputsli
    Как настроить базу данных чтобы все данные сначала хранились на Оперативной памяти но при этом сразу записывались на hdd. Естественно если будет перезагрузка все потерятся. И поэтому нужно чтобы на лету записывало на hdd но отдавало при этом с оперативки. Как настроить?

    Зачем? Если вам нужно, чтобы СУБД работала быстро, то для этого их и создают, там и так все есть. Зачем придумывать архитектуру СУБД, если это уже сделано? Тем более, не зная ничего о том, как они работают.
    Не питайте иллюзий, что вы сейчас придумаете лучшую архитектуру, чем та, над которой работают десятилетия профессионалы. К тому же, примерно как вы описали, так и работает MariaDB.
    Не "подкручивайте" настройки, дефолтных настроек вполне достаточно, что-то меняя можно "убить" СУБД. В настройки надо лезть тогда, когда есть конкретная проблема, и понимаешь, не только то, какая настройка может на это повлиять, но и то, какие другие аффекты это вызовет.
    Ответ написан
  • Uncaught mysqli_sql_exception: Ошибка в запросе мускуля, что делать?

    @Vitsliputsli
    Используйте подготавливыемые запросы. Вы передаёте данные с кавычкой, это и вызывает ошибку.
    Ответ написан
  • Почему не изменяются данные в консоле, после изменения данных в бд?

    @Vitsliputsli
    Установите режим autocommit, и не парьтесь.
    Когда изучите транзакции, тогда вернётесь к этому вопросу.
    Ответ написан
    Комментировать
  • В чем ошибка применения функции sleep()?

    @Vitsliputsli
    Вы получаете ошибку, потому как nginx не дождался ответа от php, который ожидает ответ от mysql, который лопатит ваш не хилый запрос на получение.
    Разбивайте на части, управляйте этим в коде. Как уже указано, запускайте php не через nginx, а в cli. Записывайте не построчно, а тоже блоками. 150 000 это много, попробуйте блоки по 1000, а может и меньше.
    Откуда взялся sleep? Если это троттлинг, то 30 секунд как то очень много.
    Ответ написан
  • Как вывести строки с бд в зависимости от их количества с ограничением?

    @Vitsliputsli
    Наверное, потому что:
    PDOStatement::fetch — Извлечение следующей строки из результирующего набора
    в то время, как есть:
    PDOStatement::fetchAll — Выбирает оставшиеся строки из набора результатов
    Ответ написан
    Комментировать
  • Что лучше выбрать MariaDB or Mysql?

    @Vitsliputsli
    Лучше для чего?
    В сложных нагруженных решениях используют сборку Mysql от Percona, т.к. выбран нормальный движок для таблиц и отличные инструменты мониторинга. Большинство из них разработаны Percona. Отличные имеется ввиду для Mysql, для других решений бывает и лучше, и это не значит что mysql говно, просто везде свои плюсы и минусы.
    Хз почему ChairfaceChippendale пишет, что Percona куда-то канула, на последнем хайлоуде живее всех живых. Да и решения ни куда не исчезают, даже если бы и канула.
    Ответ написан
  • Как составить запрос для удаления строк, если таких строк больше чем X?

    @Vitsliputsli
    ROW_NUMBER, либо используйте переменную.
    Ответ написан
    Комментировать
  • Как передать значения?

    @Vitsliputsli
    Как вариант, передавать в переменную значения разделенные запятыми, в процедуре IN заменить на FIND_IN_SET, что-то вроде:
    select * from test where find_in_set(field, 'var1,var2,var3')>0;
    Ответ написан
    Комментировать
  • Как написать SQL-запрос для данной ситуации?

    @Vitsliputsli
    Для MySQL <=5.7
    select
        id,
        date,
        @s:=(case when type=1 then 1 else -1 end)*sum + (case when @t<>id then (@t:=id)*0 else @s end) sum
    from (
        select * from tt order by id,date
    ) t, (select @t:=1,@s:=0) t2
    Ответ написан
    Комментировать
  • Как вывести значение в запросе если нет данных в базе?

    @Vitsliputsli
    Если я правильно понял, то вам нужен pivot. В MySQL специальной функции для этого нет, но можно так:
    select 
            max(case when id=1 then `like` end) user1,
            max(case when id=45 then `like` end) user2
        from `likes` 
        where id in (1,45)
        group by ''

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

    @Vitsliputsli
    schedule (id int serial, route_id int, station_id int, event int, event_time time) // расписание маршрутов.
    routes (id int serial, route_name string) // названия маршрутов: 110,...
    stations (id int serial, station_name string) // станции: Лебедский, ...
    events (id int serial, event_name string) // события: Прибытие, Отправление.
    Ответ написан
    6 комментариев
  • Как получить одну любую запись из таблицы, с условием что в связанной таблице не будет записи с определенным значением?

    @Vitsliputsli
    Вместо
    (`task`.`executor_id` != 5)
    нужно написать
    (`task`.`executor_id` is null)

    откуда взялось 5 совершенно непонятно.
    Ответ написан