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

    finnish
    @finnish
    Если я правильно понял, Вы получаете в ответ HTML, который добавляете на стену.
    В этом случае самым простым вариантом без изменения архитектуры приложения будет добавление в этот ответ id в качестве data-атрибута. Например, так:
    <div class="wall-post" data-id="75301">
      <!-- ... -->
    </div>

    А добавление на стену реализовать чуть-чуть иначе:
    var $post = $(response);
    var postId = $post.data('id'); // Вот и нужный идентификатор
    $("div#wall").prepend($post);
    Ответ написан
  • Как сконструировать запрос на вставку нескольких строк в mysqli statement?

    finnish
    @finnish
    Да, можно использовать один и тот же запрос с разными значениями, но при большом количестве строк производительность Вас может огорчить.

    А что если Вы создадите массив, куда будете писать все значения? Заполнять его будете одновременным с формированием строки запроса. Например, так:
    $sql   = 'INSERT INTO `customers` (`id`, `name`, `email`) VALUES ';
    $binds = [];
    $index = 0;
    $count = count($customers);
    foreach($customers as $customer) {
        if ($customer->id) {
            $sql .= '(?, ?, ?)';
            $binds[] = $customer->id;
        } else {
            $sql .= '(NULL, ?, ?)';
        }
        if (++$index != $count) {
            $sql .= ', ';
        }
        $binds[] = $customer->name;
        $binds[] = $customer->email;
    }
    $sql .= ' ON DUPLICATE KEY UPDATE `name` = VALUES(`name`), `email` = VALUES(`email`)';
    $query = $mysqli->prepare($sql);
    foreach($binds as $bind) {
        $query->bind_param("s", $bind);
    }
    Ответ написан
  • Как работают представления в MySQL?

    finnish
    @finnish
    Представление, это как подготовленный заранее шаблон запроса. Выполняя поиск по какому-то представлению, Вы на самом деле лишь дописываете к этому шаблону свои условия.

    Вот простой пример представления (назовём его `users_online`), которое показывает пользователей, проявлявших активность в течении последних 15 минут:
    SELECT * 
    FROM `users`    AS `u` 
    JOIN `activity` AS `a` 
    ON   `a`.`user_id`   = `u`.`id` 
    AND  `a`.`modified` >= CURRENT_TIMESTAMP - INTERVAL 15 MINUTE;

    При выборе онлайн-пользователей старше 18 лет, Ваш запрос будет скорее всего примерно такой:
    SELECT * FROM `users_online` WHERE `age` > 18;

    Что для базы данных равноценно:
    SELECT * FROM (
        SELECT * 
        FROM `users`    AS `u` 
        JOIN `activity` AS `a` 
        ON   `a`.`user_id`   = `u`.`id` 
        AND  `a`.`modified` >= CURRENT_TIMESTAMP - INTERVAL 15 MINUTE
    ) AS `users_online` 
    WHERE `age` > 18;

    В каждом конкретном случае база данных может оптимизировать запрос, и результирующим может оказаться нечто иное, но смысл от этого не меняется и описан в первом предложении моего комментария. Например, более простое представление:
    SELECT * FROM `users` WHERE `online` = 1;
    ... с Вашими условиями превратится в:
    SELECT * FROM `users` WHERE `online` = 1 AND `age` > 18;
    Ответ написан
    5 комментариев
  • Нормально ли хранить json в MySql?

    finnish
    @finnish
    Теория
    Реляционные базы подразумевают, что все часто используемые поля должны храниться в отдельных столбцах. В какой-то момент Вам понадобится искать/сортировать по городу, а его хранение внутри JSON сделает эту операцию крайне сложной.
    Все преимущества JSON-а сводятся к тому, что в одной записи можно "легко" добавить или удалить какое-то поле, не прибегая к модификации таблицы. Лёгкость написана в кавычках потому, что модификация одного поля выполняется сложнее, чем первоначальная запись всего объекта: взять JSON; преобразовать в объект; модифицировать значение нужного поля; преобразовать в строку; записать её в базу данных. И делать это нужно будет средствами приложения, MySQL на это просто не способен.

    Практика
    Использование JSON является нормальной практикой. Если возникает необходимость выполнять поиск по какому-то полю, оно выносится в отдельную колонку. Работы по переносу рутинные, но требуют внимательности от программиста, т.к. путь до значения изменился. Например, раньше было user.data.city и стало user.city.

    Сейчас набирает популярность PostgreSQL, где работа с JSON выведена на уровень SQL-синтаксиса. Там Вы сможете легко добавлять/модифицировать/удалять отдельные JSON-поля, не прибегая к помощи приложения. Даже индексы поддерживаются!..
    Ответ написан
    3 комментария
  • Какая часть MySQL запроса тормозит?

    finnish
    @finnish
    Обратите внимание на колонку "rows" - там указано количество строк, которое MySQL планирует перебрать, чтобы найти нужные данные. Как видите, миллион строк выделяется на общем фоне, а значит в нерасторопности запроса виновата таблица с именем `LINK_ARTICLES_TREE` AS `_tmp2`.
    Записей в этой таблице слишком много, чтобы перебирать их все. Выход я вижу один - добавить в запрос дополнительные поля для фильтрации записей, не забыв про индексы для них.
    Ответ написан
    Комментировать