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

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Если речь про shared hosting, то написать в поддержку, получить ответ возможно ли это.
    Если про vps - то руками :)
    Ответ написан
    Комментировать
  • Как сделать выборку с LIMIT и подсчет записей одним запросом?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    1. SQL_CALC_FOUND_ROWS использовать нельзя вообще. В отличии от count это безумно медленно.
    https://bugs.mysql.com/bug.php?id=19553

    2. Два запроса это по дефолту правильное решение.
    - количество запросов стоит оптимизировать когда их получаются сотни. Заменять 2 запроса на 1 - такая себе оптимизация.
    - запрос count зачастую можно оптимизировать относительно запроса с данными убрав лишние таблицы.

    3. Любые кеши стоит вводить в проект только когда у вас база реально перестает справляеться.

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

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

    Самый простой вариант решения:
    select product.* from product where
    product_id in ( select product_id from product_options where option_id = 5 and option_value = "Красный" )
    and 
    product_id in ( select product_id from product_options where option_id = 6 and option_value = "35" )

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

    Если хочется поизвращаться можно поэкспериментировать с запросом вида
    select product.product_id, count(product_options.id) cnt from product 
    join product_options on product_options.product_id = product.product_id AND ((option_id = 5 and option_value = "Красный" ) or (option_id = 6 and option_value = "35" ))
    group by product.product_id
    having cnt = 2

    На ряде запросов это может быть быстрее

    PS Вообще есть мнение что решать это на Sql в реальном проекте не очень правильно с точки зрения нагрузки, лучше какой-нибудь elastic search прикрутить.
    Ответ написан
  • Как объединить данные в таблице MYSQL?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    1. Таблица выглядит как-то очень уныло, в частности не понятно что с ключами, почему есть 2 записи с id = 1
    2. Я считаю что в общем случае оно не решается на sql, т.к не понятно что делать в случае расхождения данных.
    Правильнее использовать эту таблицу как сырые данные, и в скрипте какой-то логикой обработать.
    Ответ написан
  • Генерация коротких уникальных ключей в mysql как реализовать?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Или генерировать случайное значение в скрипте и вставлять, или через хранимые процедуры

    PS Дополнительно скажу что отказываться от автоинкрементного primary без веских аргументов явно не стоит.

    PPS Генерировать short_key можно например получая id и преобразуя его из десятичной системы счисления в какую-нибудь NNричную.
    Ответ написан
    7 комментариев
  • Вводятся в бд карякули, что делать?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Ответ написан
    Комментировать
  • Будет ли корректно, если координаты будут первичным ключем?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Навскидку это вас сразу подписывает на какой-то дополнительный геморрой в коде без какого-то значимого выигрыша.
    Imho правильно делать обычный автоинкремент + если ваша бизнес-логика этого требует вешать составной уникальный ключ на широту-долготу.
    Ответ написан
  • Выборка из базы данных по 4 таблицам?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    А в чем проблема просто аккуратно перечислить в запросе все что вам нужно
    select 
       ...
    from job
    join status on status.jobID = job.jobID
    join worker on worker.workerID = status.workerID
    join client on client.clientID = client.clientID 
    join responsible on responsible.responsibleID = job.responsibleID
    Ответ написан
    Комментировать
  • Правильно ли отработает такая транзакция?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Если между запросами INSERT FROM SELECT и DELETE в chat_lastread_temp будет вставлена строка, то она будет потеряна или транзакция этого не допустит?

    Зависит от ENGINE таблицы chat_lastread_temp.
    В InnoDB - данные могут быть легко потеряны, у вас нет какой-то блокировки.
    Опять же блокировка работает по индексу, т.е не препятствует вставке новых записей.
    Ответ написан
    Комментировать
  • Как правильно составить выборку?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Вот только сегодня был такой вопрос Как искать в базе данных SQL по группам?

    В вашем случае запрос будет:
    select 
       `offer_id`
    from `table`
    where 
       (`property_id` = "1" and `value` ="test11")
       OR
       (`property_id` = "2" and `value` ="test12")
    group by `offer_id`
    having count(`id`) = 2
    Ответ написан
    3 комментария
  • Нужно ли разделять записи с изображениями?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    бОльший объем таблицы за счет того, что там хранятся изображения со всех модулей, а значит со временем, например при создании записи с очередным изображением, пересохранение индексов будет происходить медленней.
    Реально это станет хоть как-то заметно, когда размер таблицы превысит десяток миллионов, - и даже при этом затраты например на ресайз изображений все равно будут больше чем вставка в базу.

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

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Гипотетически можно и через ajax, но в целом нет т.к сайт ляжет уже на очень небольшом количестве живых пользователей.
    Правильное решение - использовать веб.сокеты.

    Есть отличная готовая библиотека для node.js https://socket.io/
    Для PHP можно изобрести велосипед, но проще поднять отдельный микросервис на node.js который будет заниматься рассылкой этих событий.
    События в него пихать через redis / rabbitmq какой-нибудь, а основной проект уже писать на том языке на каком хотите.
    Ответ написан
    4 комментария
  • Таблица с JSON полем или несколько таблиц под каждый тип данных, какой вариант проектрирования выбрать?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Зачем изобретать велосипед?
    Есть форма на 120 полей - сделайте 120 полей в таблице.
    1 анкета - одна строчка.
    Удобно выбирать, удобно фильтровать.
    Ответ написан
    1 комментарий
  • Как лучше сохранять данные в mysql?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Если Вы уверены на 146% что искать по данным не нужно - хранить json вполне уместно, правда тогда не понятно зачем тут вообще sql.
    Если есть шанс что искать по данным все-таки будет нужно (а в случае таблиц аналитики, вероятность этого огромна) - лучше под каждый сервис заводить отдельную таблицу и сохранять данные в нормальной структуре.
    Ответ написан
    Комментировать
  • Есть что сегодня по Master-Master репликации?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Ну смотрите, - по факту сейчас master-master в той же галере работает ну очень странно даже в пределах одного дата-центра ( и да, нужно не менее 3х серверов).
    Если разнести их по разным ДЦ - репликация будет постоянно рушиться, сервера будут вставать колом, итд.
    Я бы не стал этим всем заниматься без каких-то ну ОЧЕНЬ серьезных аргументов.
    Выберите нормальный, не дешевый ДЦ и расслабьтесь.
    Ответ написан
  • Как обновить json-данные в БД?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Если вы точно знаете что нужно обновить данные у 2го пользователя в массиве, то вас спасет JSON_SET.
    https://stackoverflow.com/questions/48552009/mysql...

    Функций которые бы позволили обновить age со сравнением поля name я думаю нет, только если свою собственную писать.
    Но вообще это выглядит как изначально кривая структура бд.
    Ответ написан
  • База недвижимости. Проектирование расположение(страна, город, ...)?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Координату хранить нужно 100% как свойство объекта, но дальше дьявол в деталях - полный адрес в каждой стране (да и даже в рамках одной страны) может задаваться оооочень сложной логикой, даже рекурсивно (в рф например может быть поселок как часть города, причем может находиться как далеко-далеко, так и внутри границ)
    Но по большому счету максимально полный адрес и не нужен, нужно чтобы было понятно пользователю + работало seo.

    С точки зрения базы:
    Координату объекта хранят все (как его свойства)
    Логично что город - отдельный объект в базе (3НФ никто не отменял), а вот какие свойства у него - зависит от бизнес-логики уже вашей.
    Циан хранит тупо название с координатами центра.
    У нас есть travel проект по всяким весям рф и сопредельных - мы храним развернутый объект страна-регион-район-тип(город,село, пгт, etc)-название-координаты, где страна/регион/район это тоже справочники в бд.

    В общем и целом алгоритм такой:
    1. выбрать используемое картографическое решение: google / osm / итд
    2. изучить их reverse geocoder, структуру его ответа
    3. на основе этого, а так же планируемого расположения объектов недвижимости определить структуру вашего гео-объекта.
    Ответ написан
    Комментировать
  • Почему не работает фильтр?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Ладно, отвечу серьезно.

    По поводу самой проблемы:
    Можно в режиме телепата гадать 100500 раз о том что происходит.
    По факту вопрос слишком абстрактный, научитесь дебажить код.

    Конкретный пример: у вас есть ваш "код фильтрации".
    Идеально было бы поставить xdebug и ide которая умеет с ним работать, но на крайний случай вас спасут print_r и var_dump.
    Прямо с начала, берете, и для каждой строчки по очереди проверяете - те ли данные вам пришли, что вы ожидали, те ли строки сформировались что вы ожидали, итд.

    Скорее всего вы поймете в чем проблема сами.
    Даже если не поймете - сможете задать уже конкретный вопрос.
    Ну и хорошо бы вывод всех ошибок и нотисов включать.
    <?php
    ini_set('error_reporting', E_ALL);
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);


    Теперь в целом по коду:
    1. Почитайте про MVC. mysqli функции вперемешку с html версткой - недопустимы.
    2. Вынесите всю работу с базой в отдельную либу. есть 100500 готовых решений на гитхабе.
    sql connect в filterTable - очень плохо.
    3. В базу нельзя отправлять user input без обработки! Как минимум нужно делать mysqli_real_escape_string
    4. За запрос where concat(`fullName`, `group_name`) = ... в реальном проекте, увольняют сразу. Запрос не использует индексы и должен для каждой строки таблицы выполнить объединение 2х полей, а потом еще и сравнить. Это дико медленно.
    Нужна такая строка для поиска - собирайте её отдельным полем в базе.
    Ответ написан
  • Возможно объединить 2 запроса в 1?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Не зная точно структуры таблиц и уникальных индексов, ответить однозначно невозможно.
    В целом не советую заниматься таким, перегруженные по логике запросы практически всегда оказываются медленнее чем 2 раздельных запроса.
    Ответ написан
    Комментировать
  • PHP. Как очищать массив цикле?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    while($row = $STH->fetch()) {
    это цикл по всем кортежам ответа.
    сразу после этой строчки добавьте
    $test = [];
    Ответ написан
    1 комментарий