Ответы пользователя по тегу MySQL
  • Как сделать кастомный mysql запрос от пользователя?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    По хорошему лучше так не делать. Разбор синтаксического дерева - это довольно сложная задача и ее стоит решать в крайнему случае.
    Я бы рекомендовал ввести по полю на все ваши возможные фильтра и уже их использовать для построения запроса. Например: id (id = ), amountFrom (amount >=), createdAtFrom (createdAt >=),... Каждый фильтр объединяет в себе операцию и поле табицы. Да, прийдется перечислить все ваши поля и операции, но это решение самое простое в поддержке.

    Так же вы можете передавать массив фильтров, в стиле: [field, operation, value].
    На этапе обработки вы сможете относительно легко проверить и название поля, и операцию (>,<,=,!=,...), и заэкранировать значение. Вложенные условия будут уже сложнее.
    Ответ написан
    Комментировать
  • Cron или планировщик заданий mySQL?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Чем меньше логики на стороне БД вы будете держать - тем проще вам будет с этим жить
    Ответ написан
    Комментировать
  • Какой поставить пароль для docker контейнера mysql?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Укажите пароль для рутового юзера, не оставляйте его пустым, и будет вам счастье.
    Ответ написан
  • Можно ли реализовать "умный" поиск по БД?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Elasticsearch с морфологией вам в помощь.
    Ответ написан
    1 комментарий
  • Какие есть многопользовательские БД или как правильно работать с MySQL?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вопрос из серии: "я что-то нажала и все пропало, что делать?". Без инспекции этих сложных скриптов у вас ничего не выйдет.
    Если я правильно понимаю, у вас проблема с конкурентным доступом к одним и тем же данным.
    В принципе есть как минимум 2 относительно простых решения:

    1. Контроль за счет блокировок. Грубо говоря 1ый скрипт перед началом работы с записью N "блокирует ее", записав в memcached / redis / или через GET_LOCK этот идентификатор, если получилось - продолжает выполнение, если не получилось - пытается заблокировать, либо берется за следующую запись.

    2. Решение более специфическое, менее надежное, но более быстрое. Явно указать для первого скрипта: ты работаешь только с парными записями, а второму - с не парными.
    Ответ написан
    Комментировать
  • Поможет ли суррогатный ключ увеличить скорость вставки в таблицу?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Запросы делались по одному, без оборачивания в транзакцию (насколько я понимаю, если запрос один - то и транзакция бесполезна, независимо от кол-ва строк?).

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

    Кроме этого, batch-запросы с auto increment имеют намного меньшее max время вставки: 1,5 сек против 11,4 (да, 11 секунд на вставку 20 строк).

    Верно, это вполне ожидаемый результат.

    правильно ли я решаю эту проблему и действительно ли суррогатный ключ в таких ситуациях даёт прирост скорости?

    Не совсем. Индекс не ускоряет вставку, что обычный, что комплексный, он ускоряет поиск. Чем меньше индекс - тем быстрее он рассчитается.
    Очень похоже на то, что у вас проблема несколько иного характера. Индекс хранится в ОЗУ, тормоза на вставке вероятно у вас за счет того, что индекс не влазит в буфер движка. Это значит, что при вставке БД занимается вытеснением из буфера одних индексов другими, а это уже работа с файловой системой, что очень медленно.
    В таких ситуациях стоит двигаться в сторону уменьшения размера самого индекса.
    Ответ написан
    4 комментария
  • Зачем нужны внешние ключи прописанные в структуре БД (MySQL) - они действительно там нужны?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смысл в том, что создать запись, или изменить ее ссылаясь на не существующий внешний ключ у вас не получится, если проверка внешних ключей не отключена. Грубо говоря, это способ сохранить консистентность данных.

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

    В большинстве случаев FK не нужны, от слова совсем.
    Ответ написан
    4 комментария
  • CMS не видит MySQL в Docker контейнере?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Похоже у вас фактическое подключение происходит не через localhost, а на ip контейнера.
    Ответ написан
    2 комментария
  • Взламывают базу данных, как?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    база данных открта внешне, т.е к ней можно удалённо подключаться

    Одно из другого не следует. Для работы из вне имеет смысл использовать ssh тоннель.

    только с одного ip адреса - адреса где лежит сайт

    Если у вас shared хостинг - у меня для вас плохие новости...

    как это возможно?

    Инспектируйте код вашего сайта, полностью. Возможно права на загружаемые файлы не корректные, или в web root лежит помимо точки входа еще что-то исполняемое.
    Вполне возможно в случае ошибки - вы стектрейс выводите и еще какие-то данные.
    Возможно debug панель не закрыта.
    Возможно у вас пароль легко взламывается.
    Возможно взломали не конкретно вас, а хостера.

    Но начние с поиска: у кого в принципе есть доступ к вашей БД. Иногда взлом происходит изнутри, это печально, но случается.
    Ответ написан
    Комментировать
  • На какой сервере поддерживается mysql 7-8 версия?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Use docker/virtualbox Luke!
    Ответ написан
    Комментировать
  • Какие книги, курсы нужны для написания сложных запросов mysql?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Проще всего - решать конкретные задачи.
    Ответ написан
    Комментировать
  • Почему не работает код?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    1. НИКОГДА не публикуйте креды к базе!
    2. Не используйте подстановку данных в запрос через конкатенацию. Вместо этого используйте плейсхолдеры.
    Пример 1 (SQL инъекция):
    # Тут заэнкожено: '; DROP TABLE `users`; --
    curl -XPOST -H 'Content-type: application/x-www-form-urlencoded' -d'phone=%27%3B%20DROP%20TABLE%20%60users%60%3B%20--'

    Пример 2 (phone может содержать массив):
    curl -XPOST -H 'Content-type: application/x-www-form-urlencoded' -d'phone[]=+123'

    3. Не используйте глобальные переменные. Про это есть множество статтей.
    4. Если есть возможность - используйте \PDO, вместо mysqli.
    5. Не стоит объявлять функции/классы/трейты/интерфейсы по условию. Вместо этого используйте их по условию, но объявляйте без него.
    6. При работе с путями рекомендую пользоваться глобальными, вместо относительных, иначе этот самый путь будет зависеть от скрипта, с которого запустили ваш код, а не от того, где происходит работа с файлами.
    7. У вас конкурентно не безопасный код за счет того, что работа с файлами происходит в одном и том же каталоге, с одними и теми же именами файлов. Что будет если запустить два запроса одновременно на вытяжку всех пользователей? В лучшем случае один из запросов просто упадет с ошибкой что не может добавить в архив файл (это второй поток его уже удалил). Если будет запущено 2 запроса например на 1го пользователя и на всех - есть вероятность, что один из них вернет далеко не запрашиваемые данные)).
    8. Очень рекомендую разделить вашу обработку на 2 части:
    - Первая пусть записывает в файлики данные по пользователям при обновлении данных этих пользователей.
    - Вторая - вытягивает вытягивает только id требуемых для архивирования и уже добавляет их в архив. Имя архива стоит делать рэндомным, что бы избежать конкурентного доступа к одному и тому же файлу на запись.
    9. getUserses -> getUsers

    Конкретно по вашей проблеме: если я праивльно понимаю, вы в один и тот же архив запихиваете файлы на каждый запрос, грубо говоря один раз вытянув всех пользователей - дальше вы только обновляете их в архиве на 10к файлов, а не создаете новый архив.
    Ответ написан
    3 комментария
  • Как правильно спроектировать таблицу MYSQL?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    id int unsigned,
    createdAt timestamp,
    startedAt timestamp,
    finishedAt timestamp,
    interval int unsigned -- Я не очень понимаю, что у вас такое интервал, храните лучше в секундах.

    По крону каждую минуту (можно и 10 мин, это не особо важно) вытягиваете записи, у которых startedAt >= CURRENT_TIMESTAMP() и finishedAt < CURRENT_TIMESTAMP(). Интервал и вот это вот все уже на части пыхи обрабатываете. Не забудьте комплексный ключ для startedAt+finishedAt добавить.

    При выборке обязательно добавляйте погрешность, хотя бы секунд 5-10, либо вместо CURRENT_TIMESTAMP подставляйте округленное время, например для времени 10:20:01 используйте 10:20:00
    Ответ написан
  • Как лучше проводить поиск по большим объемам полей text?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Посмотрите ElasticSearch. Хотя у мускуля и есть fulltext индексы, но лучше использовать средства, предназначенные для полнотекстового поиска, со всякими весами и морфологическими разборами.
    Ответ написан
    Комментировать
  • Регистрация на php mysql, нужна помощь, кто знает?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Ответ написан
    Комментировать
  • Могу ли я присвоить id каждой таблице?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Разве что как часть имени. Но зачем?
    Ответ написан
    1 комментарий
  • Есть разница написания SQL запроса?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Когда зубной ковыряется у вас во рту, в первом вашем примере он использует перчатки, во втором - нет.
    Ответ написан
  • Как хранить в БД только 5 записей?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Операция удаления - очень дорогая. Вам точно нужно именно удалять? Может лучше выводить 5 последних?
    Ответ написан
    5 комментариев
  • Как работает Node.js с MySQL параллельно или последовательно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Зависит от движка MySQL, его настроек и запроса. Например обновление одного рядка в Innodb обычно блокирует только эту строку, в MyISAM блокируется вся таблица. В случае SELECT FOR UPDATE (Innodb) блокируются все выбранные строки до завершения транзакции. Операции со схемами, типа CRUD полей/ключей/констрейнтов/транкейт - блокируют таблицу полностью.
    Более детально гуглите на тему: уровни изоляции транзакций mysql.
    Ответ написан
  • В чем проблема?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вы забыли точку с запятой после

    $result = $mysql->query("SELECT * FROM `users` WHERE `login` = `$login` and `pass` = `$pass`")


    Используйте плейсхолдеры. Подход: `login` = `$login` ведет к SQL инъекциям
    Ответ написан
    2 комментария