Ответы пользователя по тегу MySQL
  • Как в Yii2 обработать одновременные запросы на вставку одинаковых значений в БД?

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

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

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

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

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

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Допустим в БД хранится массив в виде ключа => значения
    Сохраните его в базу как сериализованные данные или JSON, а потом конвертируйте обратно и проблем не будет.
    Ответ написан
    4 комментария
  • Можно ли создать базу данных с пользователем средствами PHP?

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

    Синтаксис команды CREATE DATABASE.
    Ответ написан
  • Eloquent ORM не получается составить запрос?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Для этого в Eloquent (и не только) существуют связи, в Вашем случае - один ко многим, т.е. одна сумка -> много фотографий.

    P.S. Eloquent - это такая очень удобная штука, встроенная в Laravel, для работы с данными из БД, в т.ч. позволяющая быстро настраивать связи между объектами.

    ----------

    Ещё есть вариант сделать это прямо на уровне SQL-запроса, для MySQL выглядеть будет примерно так:
    SELECT service_category.*, GROUP_CONCAT(service.id SEPARATOR ',') AS ids
    FROM service_category 
    LEFT JOIN service ON service.category_id = service_category.id
    GROUP BY service_category.id

    В данном примере, таблица service ссылается на таблицу service_category через поле service.category_id. В качестве результата получаем вот такой дополнительный столбец, где перечислены все "service"ы для текущей категории (их ID) с разделителем через запятую:
    59e33ec521904576522071.png

    UPD. Тот запрос который у Вас в примере - это НЕ Eloquent, это QueryBuilder.
    Ответ написан
    1 комментарий
  • При переносе не хочет подключаться к БД, в чем может быть проблема?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    переношу opencart на новый хост и не хочет подключаться к БД, вот что пишет:

    В первую очередь, обратите внимание вот на это:
    No such file or directory in /home/kirby/kirby-center.ru/docs/system/library/db/mysqli.php on line 7
    Почему у Вас нет этого файла? Куда он делся? Думаю, стоит проверить.

    Второй важный момент - Вы сверяли минимальную версию PHP для Вашей версии OpenCart и той, которая стоит на каком-то ("новом" или любом другом, конечном) хостинге?
    Ответ написан
    Комментировать
  • Почему не сходится число уникальных записей в mysql?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Судя по Вашей картинке, а так же вопросу, подозреваю, что дело может быть в PHPMyAdmin'е, либо в тех, кто его локализовывал (переводил на русский).

    Мой Вам совет - выкиньте PHPMyAdmin, он отлично годится, что бы сохранять дамы небольших БД или загружать их обратно в условиях хостинга. Для MySQL есть масса отличных программ:
    1. HeidiSQL
    2. MySQL Workbench
    3. Navicat
    и т.д.

    возьмите любую из них и забудьте о подобных проблемах

    P.S. Подозреваю, что в той колонке (с заголовком "Кол-во уникальных элементов") указывается на самом деле не кол-во уникальных элементов а приблизительное кол-во записей в таблице, возможно результат генерирует какая-то из этих команд: эта или эта. Если Вы хотите в точности получить ответ на этот вопрос (что там за цифра и откуда она) - нужно включить логирование в MySQL всех запросов и посмотреть, какие запросы выполняются во время открытия конкретно этой страницы... найти нужный и т.д. Но я бы не стал тратить время на такую ерунду.
    Ответ написан
    6 комментариев
  • Как рисовать ER-диаграмму?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Если это то, про что я думаю - Вы можете:
    1. Скачать и установить MySQL Workbench (официальную программу от разработчиков MySQL)
    2. Прямо в ней посмотреть/создать/что-то-ещё диаграмму, как на картинке по первой ссылке

    Насколько я помню, Вам даже рисовать ничего не придётся, программа сама отрисует все фактические таблицы, их связи и т.д.
    Ответ написан
    Комментировать
  • Почему не работает GROUP BY в Laravel 5?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Файл /config/database.php, строка 53: 'strict' => true, (в "разделе" 'mysql'), значение поменять на false.

    Подробности:
    59d3c7f6588c1557458510.png
    Ответ написан
    2 комментария
  • Как правильно организовать вывод поля, если оно находится в другой таблице?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Либо есть какие-либо другие правильные варианты?
    LEFT JOIN?
    Ответ написан
    Комментировать
  • При переносе базы теряются буквы "И" и "ы". В чём может быть причина?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    А в конечной базе (в которую переносите данные) кодировка (сопоставление) таблиц/столбцов совпадает с той базой из которой данные Вы пытаетесь перенести?

    P.S. Настоятельно рекомендую Вам использовать InnoDB (или его аналог) в качестве основного движка (типа) таблиц и кодировку utf8_general_ci (ну или какую-то другую вариацию UTF-8, на Ваш вкус), если конечно Вы не пытаетесь выжать из базы "последние соки" по части производительности, в ущерб стабильности и потенциально меньшего кол-ва всякой ерунды, связанной с кодировками.
    Ответ написан
  • Логика выбора индекса mysql?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    А все это началось при переезде с mysql 5.7 на percona server 5.7. До переезда этот запрос был мнгновенным, а теперь стал тормозить.
    Простите за сарказм, "но это же MySQL, чего вы ожидали?". Одной из особенностей данной БД является довольно "топорный" оптимизатор запросов (если его можно так назвать), который не всегда корректно может определить, какой именно индекс следует использовать. Конечно, не корректность определения "оптимального" индекса - это проблема не только MySQL, но и других БД... но, как-то уж очень слабо в MySQL (и его производных) пытаются с этим бороться. Так же проблему усугубляет тот факт, что MySQL может использовать только 1 индекс на запрос + некоторые другие факторы.

    "Что с этим делать?" - сказать сложно, вряд ли в обозримом будущем, Вам (или разработчикам MySQL или других БД) удастся решить эту проблему целиком и полностью, но конкретно в Вашем случае, из личного опыта, могу предположить, что наиболее оптимальным решением будет "тыкать пальцем, какой именно индекс использовать" ну и отслеживать/отлаживать/корректировать подобные запросы в будущем.

    Так же, хочу обратить Ваше внимание, что проблема тут скорее всего не в "Percona" как таковой, и MySQL и MariaDB и т.д., не редко грешат подобными вещами, при относительно больших объёмах данных.
    Ответ написан
    2 комментария
  • Проектирование БД электронного журнала?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Откровенно говоря, не совсем понятно чего Вы хотите добиться... Вернее, в чем именно проблема?

    При POST запросе первым делом удалять все данные по id студенту/предмету и потом записывать данные с запроса (получается 2 операции). В таком случае при неудачной записи данных, можно потерять все предыдущие данных об оценках, я думаю.
    Что бы ничего не потерялось "при записи" - есть "транзакции" (рекомендую с ними ознакомиться", но вкратце, суть такая - что либо операция будет выполнена полностью, либо она не будет выполнена вообще, т.е. произойдёт "откат" до того состояния, в котором данные были до начала транзакции).

    Заранее создать "пустые" записи без оценок в таблице для каждой даты с 1/09 по 31/05 (учебный год, 270 дней где-то). Но возникает проблема с оптимальностью использования БД, думаю пустых ячеек с оценками не должно быть.
    Я думаю так же (что пустых записей [про какие ячейки идёт речь - я пока не понял]) - быть не должно. Ещё я думаю, что плодить колонки в БД - тоже плохое решение, если в них нет реальной необходимости. MySQL (как и многие другие) поддерживает механизм "реляций" (по русски - "связей"), то есть позволяет связывать одни данные с другими и контролировать целостность (корректность) таких связей. То есть, Вы можете связать воедино многомерную модель данных, например студента, предмет, преподавателя, дату, оценку и так далее, при том, что предметы хранятся в одной таблице, преподаватели в другой, оценки с датами в третьей (и т.д.) а их совокупности - в N'ой (в данном случае, в 4-ой) таблице.

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

    Оптимизируют обычно сложные запросы, в которых участвует множество таблиц/данных, а не простые INSERT/UPDATE/DELETE'ы. Проблема не в количестве операций как таковом (к тому же, при DELETE - физически данные с диска не удаляются, а отмечаются как "удаленные" [в MySQL и не только]), а в их "сложности" и производительности. Иными словами, не пытайтесь решить проблемы подобного рода "заранее", т.к. они возможно не настанут вообще никогда, гораздо разумнее правильно спроектировать БД, чем "нагородить огород" и "сэкономить 1 (условную) операцию". Ну и не забывайте про то, что InnoDB и его аналоги (а так же некоторые другие типы таблиц в MySQL) поддерживают транзакции.

    P.S. По возможности, всегда передавайте те данные, которые реально изменились, а не всё подряд. Например, данные о добавлении/изменении/удалении какой-то оценки, это сократит и бесполезную нагрузку на БД и позволит избежать "странных" ошибок в будущем (исключения конечно тоже бывают, но это не Ваш случай).
    Ответ написан
    2 комментария
  • Почему при соединение с базами данных phpmyadmin выдает такую фигню?

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


    Возможно, по тому, что вот эта функция:
    $result = mysqli_query($connection, 'SELECT * FROM `articles_categorie`');
    требует первым параметром "mysqli_connect()", а не "mysql_connect()" как у Вас?
    Ответ написан
    Комментировать
  • Как поступить с таблицей?

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

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

    *из личных наблюдений: чем меньше таблица в MySQL (в плане объёма на диске) - тем быстрее выборка, не зависимо от того, участвую ли "лишние" поля в этой выборке или нет.

    И если да, то лучше использовать MyISAM или InnoDB?
    Быстрее - MyISAM, надёжнее (+ там ещё транзакции всякие поддерживаются, и прочие плюшки) - InnoDB. Лучше - ?.

    как сделать запись в одну таблицу сразу же после выполнения записи в другую таблицу?
    Наверное, с помощью триггера или транзакции. Не понимаю суть Вашего вопроса.

    При этом нужно знать сохранить один и тот же айдишник у них.
    Для этого есть LAST_INSERT_ID().
    Ответ написан
    3 комментария
  • Миграции могут уронить проект, как быть?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Из за миграций бд залочилась, после чего вообще упал MySQL.
    Это MySQL, с ним такое бывает.

    Причиной была слишком большая таблица с большим кол-во записей, а в миграциях был ADD COLUMN Как быть, как можно подстраховаться в таких случаях, кроме тестирования?
    Я не уверен на 100% (ещё не проснулся, что бы слишком трезво соображать), но мне кажется тут есть 2 основных варианта решения проблемы:
    1. Не использовать MySQL
    2. Использовать репликацию в MySQL

    Причиной была слишком большая таблица с большим кол-во записей
    Мне кажется, наиболее вероятной проблемой был слишком слабая машина (память, процессор, диск), для такого объёма данных БД, а не слишком большая таблица :)
    Ответ написан
    2 комментария
  • Как лучше хранить данные об обновлении статуса пользователя JSON или MSQL таблица?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    вопрос будет ли это более оптимизировано в конечном итоге? ведь если у нас будет 100к пользователей и на каждого будет приходиться по 10к записей, не загнется ли MYSQL от этого добра?

    Это уже вопрос не столько про то, как правильно хранить данные, сколько про возможности MySQL.

    100к*10к = 1млрд., при таком объёме данных всё зависит от уровня (скилла) администратора MySQL. Чисто гипотетически - должно работать, на практике, когда MySQL разрастается до очень больших масштабов - может случиться что угодно, в т.ч. могут посыпаться ключи/связи, индексы и т.д., и даже лучшие специалисты из профильных компаний помочь в этом случае смогут не всегда.

    Но, можно сказать, однозначно, что:
    а) При таких объёмах данных и кол-ве пользователей, это будет как минимум очень неплохая соц. сеть (подающая надежды) или проект подобного масштаба и бюджет позволит нанять хороших спецов для обслуживания БД такого рода
    б) JSON с такими объёмами "загнётся" куда быстрее чем база. Особенно это касается JSON'а в MySQL, который представляет из себя исключительно текстовое поле (в отличии PostgreSQL например), которое НЕ индексируется как JSON.

    P.S. Вообще, MySQL не очень любит большой объём данных в одной колонке. К сожалению, не могу сказать с чем именно это связано, т.к. детально вопрос не изучал, но личные тесты (тесты проводимые лично, для самого себя, без какого либо намёка на их объективность или истину в последней инстанции) говорят именно об этом.

    P.P.S. Попробуйте так же посмотреть в сторону таких движков, как например ARCHIVE. Я лично пробовал такой движок всего однажды и подробностей озвучить не могу, но чисто логически, он как раз предназначен для подобных задач, хранения "архивной" информации.
    Ответ написан
    Комментировать
  • Какой самый быстрый способ сравнения двух таблиц MySQL?

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

    Если репликация по каким-то причинам не устраивает, я думаю, оптимальнее всего будет не сравнивать две базы/таблицы постоянно, а например, создать триггер, который при обновлении/добавлении новой записи (возможно, это будет 2 триггера или более) будет писать в 3-ю таблицу, что "добавился" такой-то элемент или "обновился такой-то элемент", потом в "час Х" Вы собираете данные из этой таблицы, делаете выборку нужных записей (по ID'шнику например) и отправляете на дочерний сервер.

    P.S. Это один из простых вариантов.
    Ответ написан
    2 комментария
  • Как лучше хранить базу городов и стран?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    можно создать таблицы в существующей?


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

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    mysqli_result Object
    Это судя по всему, не результат, а объект результата или указатель. Примерно это должно помочь.

    P.S. Извиняюсь, ссылкой промахнулся. Исправил.
    Ответ написан
    Комментировать
  • Какой метод / формат для хранения данных при редком использовании?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    SQLite3, по моему, идеальный для Вас вариант. Вернее, почти любой язык, в т.ч. PHP, + SQLite3. Его поддержка есть в PHP, Python и наверняка, почти во всём остальном.
    Ответ написан