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

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Вопрос:
    Какую архитектуру базы данных создать, под каждый сайт отдельные таблицы или отдельную базу данных под каждый мгаазин или сотни тысяч товаров в одной держать. Кто работал с конструторами сайтов, какая у них база данных под каждого клиента. И стоит ли вообще использовать mysql или стоит рассмотреть другого вариант? Как бы вы построили базу данных, если бы таких магазинов было 100 и более.
    С точки зрения логики, безопасности, здравого смысла и ряда прочих факторов, включая архитектурные особенности (по части хранения таблиц в рамках файловой системы) самих БД - я хранил подобные данные в разных БД. Но, с учётом того, что "сотня тысяч" строк, это по большому счёту "пшик" и база уровня "шаред-хостинг" (думаю, ещё даже не VPS) - то для удобства можно хранить всё это и в одной базе.

    На счёт стоит ли использовать MySQL - лично Вам, в данный момент - я думаю стоит. Смена одной БД на другую, без полного понимая контекста того, зачем это делается и чем одна отличается от дургой - обычно ничем хорошим не горозит. Движки БД (популярных) сами по себе, "из коробки", друг от друга не слишком сильно отличаются и чудесным образом один из них "по умолчанию" не будет "лучше" чем другой. Я неоднократно работал над проектами где "сотни тысяч" (записей) появлялись ежедневно и они (эти проекты) прекрасно себя чувствовали на MySQL'е.
    Ответ написан
  • Как вывести список всех таблиц MySQL и количество строк в каждой из них впри помощи PHP?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Что я делаю не так?

    По списку:
    • Переменные в строках обычно обрамляются в фигурные скобки
    • В одном случае у Вас переменная обернута косыми кавычками, в другом нет (в запросе), нужно соблюдать единый единый стиль кода
    • Для точного подсчёта кол-ва строк в таблице можно исползовать SELECT COUNT(*) FROM table_name
    • Примерное кол-во строк, вместе с таблицами можно посмотреть такSHOW TABLE STATUS FROM db_name
    Ответ написан
  • Как перекидывать данные с одного сервера на другой?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Как такое лучше реализовать?
    Как вариант, можно попробовать настроить репликацию. Насколько я помню, в MySQL можно реплицировать в т.ч. и отдельные таблицы. Единственный момент - реплицироваться они будут немедленно, а не раз в сутки...

    Если же говорить про "раз в сутки"... На вскидку, я бы наверное сделал как-то примерно так:
    0. Настраиваем синхронизацию папки в которой будет лежать дамп таблицы, через rsync
    1. По cron'у запускаем задачу дампа таблицы (через mysqldump)
    2. Полученный дамп уходит на удалённый сервер, rsync'ом
    3. После обновления файла на сервере-получателе - по триггеру (после обновления файла) - загружаем дамп в нужную нам БД. Триггер можно попробовать прикрутить либо на уровне самого rsync либо попытаться сделать через inotify. Подробнее не скажу, не проверял лично, но в теории должно работать.

    Альтернативный для п.3 вариант, как же писал выше предыдущий оратор - можете на сервере просто принимать файл (я думаю лучшим вариантом будет упакованный в gzip/bzip дамп нужной таблицы) обычным способом, распаковывать и заливать его в БД. Отправлять файлы с сервера-источника можно curl'ом, как вариант.
    Ответ написан
  • Как правильно сделать загрузку большой таблицы csv в MySQL средствами PHP (Request Timeout)?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    То, что Вы описали (когда в браузере "Таймаут" а скрипт продолжает работать) скорее всего связано с режимом работы PHP - [F]CGI (или подобным), в этом режиме сервер ждёт какое-то время (обычно секунд 30) ответа от CGI-сервера (PHP) и не дождавшись (точнее по истечению этого времени) выдаёт timeout (который Вы скорее всего и наблюдали).

    На мой взгляд, наиболее простое решение (которое лично я бы рассматривал в первую очередь) - удалённое подключение к БД и загрузка данных. То есть, БД на хостинге а грузите в неё данные Вы с локальной машины, из программы для администрирования БД или из того же локально запущенного PHP-скрипта, это позволит как минимум настроить любой параметр (в т.ч. таймауты, т.к. подобных настроек сделать на хостинге скорее всего нельзя), либо вообще избавиться от понятия "таймаутов" (в случае использования ПО для работы с БД).

    Альтернативный вариант - напишите скрипт, который будет загружать, например по 1000 строк из Excel'я, после чего генерировать ответ (HTML-страницу), которая будет запускать этот же скрипт, с параметром "следующие 1000 строк" и так рекурсивно, до полной загрузки данных. При особом желании можно попытаться отслеживать текущее время выполнения скрипта и при приближении к порогу - соотв. генерировать ответ (как описано выше).

    P.S. Ещё один важный момент - вставка данных в режиме "1 INSERT много VALUES" обычно работает ощутимо быстрее, чем "1 INSERT 1 строка".
    Ответ написан
  • Как заблокировать одновременное редактирование записи в БД на laravel?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Как реализовать запрет на одновременное редактирование записи в БД MySQL c помощью LARAVEL?
    Добавить флаг (колонку в БД), подобный функционал был придуман и применяется ещё с лохматых годов, соотв. при попытке начать редактирование записи - этот флаг должен проверяться.

    Чуть более сложный вариант - блокировать запись на уровне БД, не знаю насколько он Вам подойдёт и нужен ли вообще, но такой вариант тоже есть.

    А в браузерах android не отслеживается закрытие вкладки!!!
    Я Вам по секрету скажу, закрытие вкладки даже в браузерах "не адроид" не всегда можно отследить и всецело полагаться на что-то подобное я бы не стал. Один из вариантов "надёжного" отслеживания наличия "клиента на линии" - выглядит примерно так:
    1. Поднимаете сервер веб-сокетов, он же будет контроллировать блокировку той или иной записи в БД
    2. Каждые N-секунд отсылаете клиенту PING-запрос, если клиент не ответил (X раз подряд, и/или в течении Y секунд) сбрасываете блокировку (ну и можно заодно попробовать клиенту уведомление отослать, или прямо у клиента в браузере повесить индикатор активности соединения). Нечто аналогичное используют множество сетевых сервисов, например IRC- серверы/клиенты.

    P.S. Это наиболее простые и эффективные варианты. Непосредственного отношения к Laravel они не имеют и с учётом контекста вопроса - и не должны.
    Ответ написан
  • Какой уровень MySQL/MariaDB нужно знать среднему php-программисту?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    PS: Страх ещё вызван тем, что на одном из прошлых собеседований меня начали спрашивать, что такое PK и индексы. Ну я ответил в общем. Потом, он начал говорить, что этого недостаточно, нужно знать как это устроено на уровне файлов и чуть ли не исходников субд. Это действительно, я должен знать подобные тонкости?
    Чёткого деления на "Jun/Mid/Sen" - нет и быть не может по определению. Технологий столько, что знать их все кому-либо не под силу. К тому же, технологии развиваются очень быстро... Соотв., компаний так же много и требований к должности у них тоже много. Тот, кто сейчас работает на должности ведущего разработчика в конторе типа ООО "Шаражмонтажсайтпродаж" (условно), вряд ли сможет претендовать на должность хотя бы мидла в какой-то серьёзной, солидной фирме.
    Ответ написан
  • Как в бд хранить ссылку на картинку?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Text?
    Я думаю, CHAR'а или VARCHAR'а с соотв. длинной будет более чем достаточно для этих целей.
    Ответ написан
  • Как сделать выборку из базы данных mysql php от указанного id до указанного id?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    MySQL: Between

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

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Как мне кажется из каменного века. Создать отдельное поле, в которое я сохраняю точное время инициации действия. В тот момент когда мне надо показать пользователю поле "account" я показываю account + ( (дата инициации дейтсивя обновления поля accoutn) - (дата отображения поля) )*(нужный параметр добавления)
    "Долбить" базу каждую секунду, без особой на то нужды, когда можно этого не делать - плохая идея. Данное решение описывает более рациональный подход, если он конечно возможен.

    Писать сторонний микросервис, который будет отправлять каждую секунду запросы в БД и увеличивать значение.
    Не знаю, что Вы подразумеваете под "сторонним микросервисом" и как это в конечном итоге должно работать (логически), например при нагрузке, запросы могут вставать в очередь и данные могут терять свою актуальность в этом (вашем) случае... Можете попробовать несколько вариантов:

    1. Попробовать использовать "родные" события MySQL

    2. Создать примитивный скрипт PHP, типа такого и запустить его (на бесконечное выполнение):
    <?php
    while(true) {
    mysql_query("..."); //Условно
    sleep(1);
    }
    но, он будет выполняться не 1 раз в секунду, а с паузой в 1 секунду

    3. Загадить крон заданиями, в кол-ве около 60 штук (т.к. крон задания запускаются минимум 1 раз в минуту), как это примерно должно выглядеть описано здесь, что в целом тоже не очень надёжно, т.к. высока вероятность, что рано или поздно, запросы могут отвалиться, приводя тем самым самым данные в неактуальное состояние.
    Ответ написан
  • Как сделать кэширование SQL результатов?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Возможно ли сохранить объект ответа sql, без выполнения fetch?
    Не совсем понимаю, в каком ракурсе речь идёт про fetch и что означает "сохранить объект ответа в базе"? Курсор сохранить?

    Курсор в базе сохранить, вряд ли Вам удастся, а вот сохранить результат можно в другую таблицу, не получая результаты запроса из БД. Как это сделать, написано например тут. Сохранить результат можно, например, во временную таблицу (в т.ч. хранящуюся в оперативной памяти, для скорости), или в постоянную таблицу, или в таблицу в другой БД на этом же сервере (и т.д., вариантов масса).
    Ответ написан
  • Для чего нужен MySQL Shell на Windows?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Информации о том, что такое Shell и для чего он нужен в сети очень мало. В чем смысл этого Shell? В каких случаях мне без него не обойтись? И где можно почитать об этом поподробнее?


    Почему же мало? Вот тут написано про него, достаточно подробно: раз и два.

    Насколько я понимаю, это "улучшенная" версия обычного консольного MySQL-клиента, обойтись без которого Вы можете совершенно спокойно, если работа в консоли Вам претит или Вы привыкли работать через "оконные" программы (что безусловно удобнее, в ряде случаев). Скорее всего, разница между стандартным MySQL-клиентом (консольным) и этим новым, примерно такая же как между Windows-cmd и Windows PowerShell... И появился он судя по всему, только в MySQL 5.8 (8.0).
    Ответ написан
  • Оптимальная конфигурация для сервера?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Планирую переезжать на новый сервер. Подскажите какую версию php выбрать 7.0 или 7.1
    Если Ваш код работает и на той и на другой - я бы выбрал 7.1 по определению. Т.к. она новее и некоторые фреймворки (насколько я помню, Symfony-4 входит в их число) уже требуют версию PHP не ниже 7.1. Т.е. с учётом "с запасом на будущее", я бы взял максимально новую из доступных версий PHP, если Ваш код (проект), который уже написан, на ней запустится.

    И какую версию mariaDB - 10.0 или 10.1 ?
    MariaDB... думаю по тому же принципу. Судя по всему, особо глобальных различий между версий 10.0 и 10.1 нет, но я бы поставил последнюю из этого списка, т.к. судя по всему, её разработчики попытались что-то улучшить (скорее всего, обосновано).
    Ответ написан
  • Как проверить, существует ли виртуальная таблица?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Можно ли сделать проверку перед удалением?
    Оно? Я конкретно вот про этот пример:
    DROP VIEW [IF EXISTS]
        view_name [, view_name] ...
        [RESTRICT | CASCADE]


    А точнее конкретно про вот эту директиву: IF EXISTS
    Ответ написан
  • JSON тип данные в MySQL, в чем минус?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    JSON тип данные в MySQL, в чем минус?
    Основных минусов на мой взгляд несколько:
    0. Это MySQL (который в свою очередь стандарты SQL никогда особо не жаловал)
    1. JSON в MySQL - имеет не бинарный формат и не индексируется (ну разве что как текст?)
    2. В SQL-2016 появилась спецификация для нормальной работы с JSON и когда она будет реализована в MySQL (и будет ли реализована вообще когда-нибудь, с учётом того, что они и куда более старые стандарты реализовать не могут) - неизвестно
    3. и т.д.

    но мне интересно..в чем-то вредно использовать JSON тип данные? например при запросе в БД замедляет скорост работу?
    Нет, Вы же только что сами сказали, что:
    Я пробовал использовать JSON тип данные MySQL...вроде все в порядке.
    :)))

    я использовал жсон в место таблица релешин....то есть например в таблица постов есть поля категории и все категории в одном ячейке в формат жсон сохранено...
    Мне кажется, тут вообще вопрос в JSON'е не стоит ни разу... Глядя на то, как Вы обращаетесь с данными... При таком обращении с ними (данными) - по моему, вообще нет никакой разницы, что там будет, JSON или XML или ещё что-нибудь...
    Ответ написан
  • Какое на текущий момент самое популярное десктоп ПО для работы с MySQL?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Navicat - платное, для работы с не только MySQL
    MySQL Workbench, HeidiSQL - бесплатное, для работы конкретно с MySQL

    P.S.
    какое на текущий момент считается самое лучшее ПО для работы с MySQL
    Что значит "лучшее"? Вообще, чисто гипотетически, "лучшее" в абстрактом смысле ПО - будет то, которое разработали те же, кто и разработали сам MySQL, т.е. MySQL Workbench.
    Ответ написан
  • LEFT JOIN в одном запросе или два запроса с IN?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Что бы узнать что будет быстрее - нужно понимать, в каком порядке выполняется запрос. MySQL в этом плане довольно специфическая БД с массой своих особенностей.

    Наиболее простой вариант выяснить скорость выполнения запроса - посмотреть, сколько запрос выполняется в программе для администрирования MySQL (любой, вменяемой, например, HeidiSQL).

    Способ чуть посложнее - воспользоваться EXPLAIN.
    Ответ написан
  • Можно ли использовать такую структуру таблиц?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Здравствуйте.
    В проекте есть таблица posts - это таблица с постами из разных социальных сетей.


    Здравствуйте. С учётом того, что в тегах Вы указали MySQL, подозреваю, что используете Вы именно эту БД... А у этой БД (как и у многих других) есть её характерные особенности. В частности, MySQL довольно быстро обрабатывает таблицы с большим количеством записей (вертикально) и начинает прилично так проседать, когда кол-во столбцов (или того хуже, объём данных в этих столбцах) растёт (горизонтально). Это из личного опыта, и на возведение в статус аксиомы - не претендует

    А так же по той причине, на основании следующего:
    1. Насколько я понимаю, данные у Вас из разных соц. сетей - по определению разные (в смысле, какая-то их часть), но их фактическое количество (кол-во соц. сетей или источников данных) - фиксированное
    1.1 Даже частично одинаковые данные из разных соц. сетей могут иметь разный формат, например пост из твиттера не может быть длинее N символов (не помню сколько... 140?), а пост в ФейсБуке - может быть куда больше... и т.д.
    2. При добавлении новой соц. сети - у Вас добавляет не просто какое-то "радомное свойство к товару", типа: "была газовая плита, у нее была ширина и длина, сегодня померили - нужно теперь высоту добавить", с введением новой соц. сети в код приложения добавляется какой-то довольно "толстый" модуль, для обработки конкретно этой соц. сети

    С учётом выше сказанного, я бы делал для каждой соц. сети, отдельную таблицу, так как:
    1. Кол-во параметров для каждой соц. сети не меняется (или меняется крайне редко)
    2. Таким образом одна таблица будет меньше занимать на диске, т.е. в некотором смысле - это будет сегментирование (хоть и в несколько упрощенной и "вынужденной", а не осознанной форме), что в общей сложности повышает производительность
    3. Кол-во "дыр" в данных у Вас будет гораздо меньше, а с учётом того, что постов там у Вас тысячи, а соц. сете не 2 и не 3, а уже 14 и это не предел...

    P.S.
    Как такой инсёрт сделать в две таблицы вместо одной?
    Сделать два инсёрта. Если для Вас очень принципиально время вставки и оно гораздо важнее времени получения данных из таблицы (и два инсёрта - гораздо медленнее одного) - используйте соотв. тип табиц, кажется он называется "ARCHIVE" в MySQL.

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

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Помогите пожалуйста
    Вы не пробовали обернуть значение в кавычки? Как-то так например:
    $sql_select = "SELECT * FROM `visits` WHERE login='{$_SESSION['login']}'";


    P.S. А вообще, если запрос не работает - довольно верное средство - взять и запустить его в в базе "напрямую". В вашем случае, это будет выглядеть примерно так: echo $sql_select; exit; - получаете запрос, запускаете его и формулируете вопрос более конкретно, на тему того, "что именно не работает" (в данном случае, запрос или его генерация) и прикладываете номер соотв. ошибки.
    Ответ написан
  • Как в Yii2 обработать одновременные запросы на вставку одинаковых значений в БД?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    В таблице ставок нет уникального индекса на item_id+price.
    Почему?

    С виду кажется, что нужно просто прописать уникальный валидатор в модель ставки для валидации пары значений item_id + price
    Лично мне - так не кажется.

    Есть ли возможность в Yii2 предотвратить вставку одинаковых значений
    Эта возможность должна быть в БД, а не в Yii2, чисто логически.

    при одновременной посылке одинаковых запросов, обе проходят валидацию
    А как Вы одновременно генерируете одинаковые запросы? (просто интересно)

    Варианты?
    1. Добавить UNIQ-индекс и не изголяться
    2. Блокировки
    Ответ написан