Ответы пользователя по тегу MySQL
  • Как извлечь топ 15 очков из таблицы чтобы игроки не дублировались?

    @rPman
    так?
    SELECT user_id, name, MAX(points) as max_points
    FROM `games`
    GROUP BY user_id, name
    ORDER BY max_points DESC
    LIMIT 15;
    Ответ написан
    1 комментарий
  • Возможна ли sql инъекция?

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

    Чтобы воспользоваться уязвимостью нужно серьезно зарыться в исходники php или mysql и понимать как обрабатываются ими мультибайтовые кодировки.

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

    @rPman
    заверши транзакцию в конце скрипта перед close - commit
    p.s. в 2024 году использовать mysqli это моветон.

    использовать видео, да еще и такое зашакаленное и на неадекватном хостинге (как так, по пробелу паузу не делает) чтобы передать исходники это прямое издевательство над теми у кого ты просишь помощи.
    Ответ написан
    9 комментариев
  • Можно ли в mysql хранить 200 колонок, для 10+млн записей?

    @rPman
    Да, для хранения, добавления и чтения данных с анализом этот подход очень хорош, ценой незначительного для твоих объемов (кратного, Rsa97 все расписал) ты получишь огромный прирост производительности. Настоятельно рекомендую протестировать на тестовом стенде на своих данных, особенность хранения null записей в innodb и работа индесов с ними. Что лучше в твоем случае парный индекс в денормализованной форме или 200 индексов в нормальной можно будет определить только тестами (большая таблица может потребовать больше оперативной памяти на индексы).

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

    @rPman
    Left join, оставит записи из левой части, где обычно базовая таблица, а справа подчинённые и справочники (если порядок другой то right join)
    Ответ написан
    Комментировать
  • Правильный бекап базы данных mysql?

    @rPman
    проверять работоспособность бакапов

    p.s. интервал времени между бакапами так же нужно согласовать с веяниями бизнеса, так как это определит, как много информации ты потеряешь при ее восстановлении, и вдруг сутки это слишком больно и нужно делать чаще

    p.p.s. мегаоперативный бакап это репликация (не заменяет обычный так как не защищает например от ошибки пользователя сделавшего delete * from data) с рабочими скриптами превращения резервной ноды в оперативную, тогда смерть базы от аппаратных проблем (например пожар или кража) не остановят бизнес
    Ответ написан
    Комментировать
  • Какой способ хранения и выборки данных предпочтительней?

    @rPman
    Нужно разделять оптимизацию доступа к данным и их хранение.

    Да, выбирать конечно второй, но возможна ситуация, к примеру когда сбор аналитической информации по дням/неделям/месяцам/годам станет занимать значительное время а доступ к этой информации нужен частый, то разработчики вынуждены оперативно считать их хранить эти данные, дублируя их с исходными.

    Один из способов - считать агрегированную информацию в триггере на изменение и добавление данных.

    Поэтому ответ на твой вопрос может стать - первый вариант, но исходные данные хранить в неагрегированном виде в любом случае.
    Ответ написан
    Комментировать
  • Как перенести базу данных из СУБД Postgresql в MySQL?

    @rPman
    Если ты программист, то написать программу в 10 строчек, копирующую содержимое заданной таблицы из одной базы в другую для тебя не должно быть проблемой. Как минимум на php с использованием PDO проблем не возникнет.

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

    p.s. экспортировать и импортировать данные в своем формате умеют некоторые универсальные GUI для баз данных, например та же WorkBench, там тоже можно сделать экспорт отдельно в виде insert-ов и отдельно структуру.

    p.p.s. ну перенесли вы данные, но данные это самое легкое, запросы тоже переносить нужно, а вот тут совместимость может быть слабая.
    Ответ написан
    Комментировать
  • Производительность решения SQL like vs join?

    @rPman
    Ты забыл третий вариант, самый быстрый и наиболее предпочтительный если общее количество опций не велико (сотни, например у mysql лимит 1024 колонок максимум) - каждая опция это своя колонка, пустое (null) значение будет значить отсутствие опции у записи.

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

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

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

    p.s. если говорить про твои варианты:
    * для 1 используй json сериализацию (опция=значение) в mysql для работы с такими данными есть соответствующие методы
    * для 2 постарайся вместо текстовых наименований опций использовать числовые идентификаторы, заведя соответствующий классификатор либо в базе в отдельной таблице либо в виде констант в коде.

    p.p.s. Ну и еще вариант, если тип значений опций - boolean (либо ограничен небольшим количеством значений, например цвет светофора 4 - выключен, красный, желтый, зеленый) то так же заводи для этих значений числовой эквивалент. В этом случае у тебя появляется еще бонус, упаковывать битовые значения (где количество вариантов 2^x и x это количество бит) и хранить в целочисленном поле сразу несколько (правда не все базы позволяют индексировать операции с битами).
    Ответ написан
    3 комментария
  • Как получить массив в массиве, в одном запросе?

    @rPman
    Зачем?

    Я надеюсь ты объединяешь в одном запросе данные изначальной таблицы и той из которой собираешь data с помощью inner (left если нужны записи с пустым data) join?

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

    Если тебе нужен плохой совет, ты можешь сериализовать данные, собрав строку из них, например с разделителем ',' с помощью GROUP_CONCAT. В этом случае, используя группировку ты исключишь из результата запроса дубликаты (который умножает данные таблицы на данные data, дублируя колонки из таблицы) но потратишь время на конкатенацию на sql сервере и парсинг (для числ да простой) массива из строки на бакэнде.
    Ответ написан
    6 комментариев
  • Есть ли слово из переменной в списке (разделено запятой) в бд?

    @rPman
    Ты пытаешься список ключевых слов записать как одно значение, это нарушает идеологию работы с реляционными базами, правильно - у тебя должны быть таблица справочник ключевых слов (id,name) и таблица связей м-м (две колонки идентификаторы) между твой целевой таблицы и справочником (каждая запись в ней факт наличия ключевого слова. Соответственно запрос будет на наличие if exists или полсчет количества count или в зависимости от ситуации, проверка наличия связи по конкретному слову через left join и проверки результата на null.

    P.s. если решать именно твоим способом, то у тебя должны быть 4 условия в or, проверки искомого слова слева like "слово,%", справа "%,слово" по середине "%,слово,%" и в единственном варианте ="слово"

    P.s.s. у mysql есть поддержка работы с json сериализацией, храни тогда список слов в json
    Ответ написан
    5 комментариев
  • Каким образом можно снизить нагрузку на MySQL базу данных?

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

    Как частный случай наоборот, загрузить данные во временную таблицу и выполнять анализ уже на sql сервере, но это только если таблица не вмещается в память бакэнда или это неоправданно

    Много мелких запросов это сильно тяжёлая задача для sql баз данных, тем более для слабой машины
    Ответ написан
    Комментировать
  • Сильно ли тяжело для базы данных innoDB 1 500 таблиц?

    @rPman
    Полторы тысячи таблиц для innodb это мало и дополнительной нагрузки это не создаст (помню были какие то заморочки с myisam уже при количестве таблиц больше 100).

    'очень частые' у разных людей разное значение, для кого то 1 раз в секунду - уже нереальная нагрузка, а кому то нужно 10к запросов в секунду обработать. Так вот во втором случае оптимизация будет требоваться уже на ином уровне и возможно 1500 таблиц станет заметно нагружать базу.

    Задача не ясна, рекомендации невозможно дать.
    Ответ написан
    1 комментарий
  • Почему скрипт не понимает, что данные в MySql изменились?

    @rPman
    код, который обновляет данные случайно не начал транзакцию и не завершил ее?
    Ответ написан
  • MySQL + PHP :: Хранение паролей клиентов в базе данных с целью их извлечения, как защить?

    @rPman
    Забудем что принципиально хранить пароли - плохая практика, но так как задача уже такова что хранение вынужденное то:
    1. шифровать логины и пароли (весь набор данных, не имеющих смысл друг без друга, лучше хранить сериализованными в одном поле, особенно когда от задачи к задачи поля меняются, т.е. логин пароль почта api key, gpg ключи шифрования и т.п. пусть это будет свободная json строчка, за ее анализ отвечает клиентская часть приложения)
    2. ключом/паролем, который не хранится в базе данных (он должен являться частью бакэнда, т.е. в том месте где на бакэнде хранятся настройки подключения к внутренним сервисам либо отдельное место хранения) - при разделении работ между людьми (обслуживать базы могут другие люди, чем те кто имеет доступ к бакэнду) чувствительные данные не утекут легко.
    3. логируй все, т.е. показал пароль - сохрани в специальном логе (в базе или файлах уже вопрос организации работ) - кто, когда, с какой машины, что получил
    4. когда показываешь пароль на клиентской машине, повторно запрашивай авторизацию (чтобы не использовалась автосохраненная), важный момент, это исключит кражу данных уже на стороне клиента, очень мало кто правильно организует рабочее место (это просто неудобно и дорого).
    Ответ написан
    2 комментария
  • Как оптимально сделать выборку из БД?

    @rPman
    если нужно по каждой категории - добавь к запросу group by категория, в select будет sum(сумма) и категория

    если выбор критерия вычисляемый, пропиши его формулу в select сумма as field_name ... group by field_name
    Ответ написан
    Комментировать
  • Как увеличить скорость загрузки данных в Mysql?

    @rPman
    Отключить/удалить индексы, вернуть после полного импорта. Это самое большое ускорение.

    Ещё можно изменить стратегию кеширования данных, дело в том что сервер базы данных слишком щепитильно относится к корректности загружаемых данных, выдавая частый fflush, т.е. принудительную запись данных с ожиданием ее окончания. Это актуально для режима работы с базой но первоначальное наполнение пустой базы можно не боятся сбоев, ведь попытку можно перезапустить с нуля. Например можно изменить режим записи в журнал ext4 на data writeback или лучше средствами виртуализации настроить кеширования диска на -device cache=unsafe для qemu.
    Ещё круче можно настроить bcache с кеширующим диском на ramdisk....

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

    @rPman
    Зависимость требований ресурсов от количества записей (участвующих в индексах) - примерно логарифм log(N) или если индексы не используются то N*log(N)

    Про скорость чтения:

    Пока файлы индексов или не иднексируемые данные кешируются в RAM, с увеличением объема данных скорость работы БД будет падать незначительно (время на получение самих данных будет выше чем их поиск), но как только оперативная память закончится (индексы в кеши не влезают) то скорость работы скачкоорбазно упадет.

    Про скорость записи:
    К сожалению на запись данных в базу данных активно используется диск, соответственно зависимость log(N) сохраняется, но будет с большим коэффициентом от скорости диска на запись.

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

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

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

    @rPman
    Похожесть - перебором.

    У меня в поиске заголовков статей (40к) postgres подсчет левенштейн со всеми записями был меньше секунды, а ведь он фактически перебор делает. Но задача на самом деле сложнее.

    Посмотри хорошую статья с обзором алгоритмов, статья старая но взяв из нее алгоритмы будет что гуглить дальше

    p.s. рандомная ссылка из гугла, в работе есть код на питоне
    Ответ написан
    Комментировать
  • Как безболезненно изменить модель mysql в существующей бд?

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

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

    На практике никто особо не заморачивается, особенно в вебе. Запустил обновление базы, не нарушающее работу старого кода, затем обновил код, и после чистишь базу от старого кода. Даже если в этот момент система будет under maintaince какое то время, не беда...
    Ответ написан
    Комментировать