Задать вопрос
Ответы пользователя по тегу MySQL
  • Как уменьшить нагрузку на Mysql запрос на очень нагруженной базе?

    @rPman
    ты уже задавал этот вопрос, думаешь больше информации тебе придумают?
    раз тормозит слейв, то почему бы не решить проблему грубой силой и поставить второй, третий.. десятый, а свои запросы делай на тот слейв, что менее нагружен в данный момент или тупо по очереди

    p.s. какой объем данных? не будет ли эффективнее реализовать свои таски в оперативной памяти своего отдельного приложения, и вместо базы данных пусть твой бакэенд (или кто там) лезет к этому приложений... ни одна sql база данных ни при каких условиях не будет работать быстрее, чем твое собственное приложение с данными в оперативной памяти, а уж если тебе хватит одного потока то и на разработку решения потратишь очень мало времени
    Ответ написан
    8 комментариев
  • Как удалить из трех или более таблиц mysql по одному id?

    @rPman
    а left join?

    По уму правильный способ, при создании foreign key index нужно указать on delete cascade, и тогда при удалении записи в главной таблице, все связанные записи удалятся автоматически
    Ответ написан
    Комментировать
  • Очень медленный mysql запрос из-за ORDER BY, как можно ускорить?

    @rPman
    я могу ошибаться, но у тебя похоже индекс не используется
    добавь индекс на пару полей topic_id,comment_id
    Ответ написан
    1 комментарий
  • Как оптимизировать сложный запрос на нагруженной базе MYSQL?

    @rPman
    если update запросов на порядок меньше чем запросов на select, то типовой способ ускорения последних за счет замедления update - исполнение запросов select заранее, складывая их результат в специальную табличку тригерами

    так же хорошим подходом является кеширование результатов на бакэнде, не важно как, главное в оперативной памяти, и инвалидировать кеш на update-ах.

    p.s. сразу бросаются хранение типов и статусов в строках, переделай в числа, должно заметно уменьшить базы данных, уменьшить объем базы и индексов.
    лучше всего enum
    Ответ написан
  • Что лучше выбрать Partitioning или вынос данных в другую базу (таблицу)?

    @rPman
    partitioning

    пока ты остаешься в пределах одной базы, у тебя работают например транзакции, т.е. операции записи будут атомарными, даже если будут задевать в пределах этой транзакции несколько партиций, а если раскидаешь таблицу по нескольким базам, транзакции уже работать не будут.

    а вот ускорить работу партиций так же как это сделала бы дополнительная база - можно, разместив файлы таблиц на физически другом диске (особенно это актуально если у тебя hdd)
    Ответ написан
    Комментировать
  • Как вывести информацию с БД массивом?

    @rPman
    в $query->execute(['ref' => $my_ref[0]]); данные массивом передались.

    к сожалению биндинг в pdo не умеет работать с массивами, каждый параметр должен быть конечным объектом (число., строка...)

    так же чтобы условие в sql обрабатывало массив нужно использовать выражение
    select ... from ... where id in (1,2,3,4,...)

    поэтому чтобы решить указанную задачу нужно формировать sql запрос по старинке (без использования prepare и биндингов), естественно аккуратно к значениям, либо валидировать их что они являются числами, а если должны быть строки - то правильно экранировать

    $sql='select ... from ... where id in ('.implode(',',$id_array).')'

    Так же проверь что массив идентификаторов не пустой, так как иначе будет ошибка в sql

    p.s. осторожно, количество значений в 'id in' лимитировано (кажется 1000), если инужно больше, то придется создавать временную таблицу, заливать в нее искомые идентификаторы и строить запрос с left join

    Еще я встречал похожий метод но с использованием биндингов, когда sql запрос генерировался вида:
    select ... from ... where id in (?,?,?,?,...)
    с нужным количеством ? тогда передав массив напрямую в execute можно получить результат, лимит на количество ? еще меньше, это определяется драйвером базы данных.

    p.p.s. и совсем сверху на засыпку методика, ее имеет смысл использовать когда со стороны клиента фильтруемых данных больше чем 1 поле (например 2 массива точнее таблица с несколькими колонками) и очень не хочется заполнять в базе временную таблицу с этими данными (это очень сильно роняет производительность) то можно сформировать внутри sql таблицу из константных данных:
    select ... from ...,
    (
      select ? as col1,? as col2
      union select ?,?
      union select ?,?
    ...  
    ) x where ...
    Ответ написан
    4 комментария
  • База данных MySql, как сделать переменную, с индивидуальным значением для всех аккаунтов?

    @rPman
    Если по каким то причинам таблицу для данных создавать не желаете
    то можно использовать вьюху или хранимую процедуру, в которой прописываете буквально все значения от пользователя (или любых других условий)
    SELECT CASE
      WHEN USER() =='one@localhost' THEN 1
    ...
      ELSE 0
    END

    т.е. местом хранения тут будет код хранимой процедуры или вьюхи а для ее обновления потребуется вызов ddl
    Ответ написан
    Комментировать
  • Как можно увеличить скорость записи в бд mysql?

    @rPman
    Что значит стопорится? зачем гадать, расставь по больше вывода в свои логи отладочной информации (когда принял запрос, обработал, отправил транзакцию, когда получил ответ от базы и т.п.) с таймингами и смотри что и где происходит в проблемный момент

    Что за пиз...ц с сериализацией картинок в base64 потом это все в json, а в базе хранить php-щным serialize?

    http post прекрасно справляется с отправкой файлов, там своя сериализация, никто не мешает миксить в запросе get и post данные

    Не храните картинки в базе данных, никак, ни блобом ни сериализацией, кто придумал этот маразм, в каком бредовом туториале это прочитали и каждый второй это реализует?

    Файлы храни в файлах на диске, а в базу записывай путь или имя файла (либо сам файл по идентификатору называй), раз в сто лет на обслуживании базы сравнивай наличие файлов на диске и записей в базе и удаляй висяки (образуются если во время обработки произошла ошибка, например скрипт умер, файл записали а транзакция в базе откатилась)

    p.s. в php во всех репозитариях есть красивый сериализатор igbinary, если что он в каком то смысле даже быстрее старого serialize и точно компактнее, его потихоньку в стандарт пропихивают, например можно использовать его для хранения сессий
    Ответ написан
    1 комментарий
  • Порекомендуйте подходящую базу данных?

    @rPman
    которые при генерации отчета как либо аггрегируются.
    это чуть ли не наисложнейшая задача для баз данных, 80м записей тем более

    Партицируйте прямо по суткам.

    Убирайте транзакции, нафиг вам тут innodb когда хватит myisam, оно на запись быстрее, у вас база write once read ... тоже once.

    У вас там база данных упирается случайно не в работу с диском? в облаке можно взять несколько дисков, они будут независимыми, раскидай по ним таблицы (myisam штатно поддерживает симлинки), что может дать прирост в скорости в разы только за счет этого, даже если они ssd, например отделить хранение индексов от данных или отделить старые данные от сегодняшних.

    На время обработки аналитики можно потюнить файловую систему и отключить flush для файлов таблиц (например ext4 data writeback и можно отключить журнал) - сильно ускоряет именно запись, особенно если много ram, это включает большой риск потери/порчи данных при сбросе ос но с другой стороны вероятность этого очень мала и как я понимаю, данные в базу и так пишутся из какого то другого хранилища, т.е. при проблеме с сервером просто перезапускается обработка за текущие сутки.

    Уберите индексы на запись, все, сначала пусть идет вставка данных без их индексации, затем создаете индекс (это на порядок быстрее) и уже потом строите аналитику.

    Общая аналитика должна не работать с самими данными, а с их посуточной выжимкой (возможно в результате и хранить их не придется) считай это самодельные индексы. Грубо говоря если в запросе на аналитику стоит count,max,min,.. то достаточно сложить посуточные значения и для глобальных считать уже по ним... само собой если запросы с условиями и сложными группировками, то надо думать но все решаемо.. грубый пример нужно считать агрегацию по часам, вот в индексы и пиши суточные значения по часам, а если надо постранично то для каждой страницы для каждых суток считаешь, потом агрегируешь уже по этим результатам.
    Ответ написан
    6 комментариев
  • Как обновить данные в одной таблице, после обновления данных в другой?

    @rPman
    на некоторые связные изменения в sql базах данных есть встроенный функционал, например foreign key index - это та самая связь между двумя таблицами по значению в поле или нескольких

    при создании индекса можно указать, что делать со связанными записями в таблице, например каскадно удалять при удалении записи или прописать null
    смотреть on delete и on update statements

    любые более сложные условия делают с помощью тригеров
    Ответ написан
    4 комментария
  • Почему начала тормозить mariadb?

    @rPman
    по USB 2.0 внешний жесткий диск
    странный сетап
    но
    скорость чтения 304.13 K/s скорость записи не больше 604.13 K/s...
    говорит что usb у тебя работает на 1мбит скорости, что очень похоже на usb1 версию

    чтобы удостовериться, отключи базу данных (убери нагрузку) и проверь диск на линейное чтение любым способом, например прочитав то 2-гигабайтовый файл в null
    dd if=/path/to/file of=/dev/null bs=1024k status=progress


    причина деградации скорости usb2 до 1 версии банальна, на том же контроллере (соседний вывод usb или к примеру тот же usb хаб) висит мышка/клавиатура или любое другое устройство usb1 версии. Такова особенность работы usb хабов, понижают скорость до минимально поддерживаемого (даже если у тебя будет usb3)

    Решение - подключить мышь/клаватуру или диск на другой контроллер (просто экспериментально перебери порты)
    Ответ написан
  • Как собрать сервер на устаревшем ПО?

    @rPman
    Одно слово - вииртуализация.

    Так как при попытке установить старую версию ОС на новое железо можно получить странные проблемы (а можно не получить, не попробуешь не узнаешь) но главное устаревший софт уже давно не поддерживается и никто баги в нем не чинит. Закрыть виртуалку фаерволом (просто когда она за nat уже хорошо) логичнее всего.

    Поэтому ставишь современную ос, а внутри средствами виртуализации или любых инструментов создания песочницы (даже chroot поможет) устанавливаешь устеревшую версию ОС и приложений. В простом варианте может подойти просто миграция (читай копирование) из старого железа внутрь виртуалки как есть, останется настроить сеть и все продолжит работать как работало.

    ОС FreeBSD 7.2
    уходи от этого, на linux, рекомендую для новичков - на ubuntu, сама freebsd может и норм но настраивать что то нестандартное будет новичкам тяжелее на порядок

    С высокой вероятностью Lighttpd и MySQL подойдут новых версий, и большая часть проблем создаст код, написанный под старую версию php, т.е. почему бы не попробовать установить на современную ОС только его (но придется собирать из исходников, я не видел бакпортов php такой старой версии под новые) т.е. вся возня, найти максимально высокую версию ОС для запуска в виртуалке, для которой есть php4

    Для установки старой версии ubuntu можно использовать архив old-releases.ubuntu.com и указав их репы в debootstrap собирать какую угодно старую версию минисборки в каталог, которую уже можно виртуализировать хоть chroot хоть lxc хоть полноценной виртуалкой
    Ответ написан
    2 комментария
  • Почему не срабатывает код php?

    @rPman
    ты 'добросовестно' отключил вывод сообщений об ошибках с помощью @ при вызове unlink и теперь удивляешься что тебе непонятно, почему ничего не работает?

    убери это и смотри по логам, там будет точно указано, какой файл и почему не получилось удалить
    Ответ написан
  • Как правильнее будет синхронизировать удаленную бд локально?

    @rPman
    правильно - master-slave репликация, все изменения главной базы автоматически, допускается с некоторым лагом, прилетают на подчиненную slave, с этой базой можно работать в readonly режиме как с обычной базой, и ее нагрузка никак не скажется на нагрузку основной.
    Ответ написан
  • Как запустить сервер на своем ПК?

    @rPman
    Настоятельно рекомендую не использовать готовые мега сборки для разработки, а взять чистую linux операционку (пусть и серверных ревизий но не обязательно) и установить ее в виртуальной машине (можно в windows wsl использовать но я так же настоятельно не рекомендую этого, так как проблем это добавит а для начинающего лишние они не нужны), для начинающих пользователей рекомендую VirtualBox

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

    Современный разработчик просто обязан иметь базовые навыки devops для настройки рабочего окружения
    Ответ написан
    Комментировать
  • Как сформировать запрос к 3-м таблицам сразу?

    @rPman
    select ... from ...
    union
    select ... from ...
    union 
    ...
    выдаст уникальные строки, если использовать union all то нет
    Ответ написан
    Комментировать