• Как исправить долгое выполнение запросов на большой таблице?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Фактически выполняется сравнение двух длинных BINARY значений, причём при полнейшем отсутствии какого-никакого индекса. Чё б ему не тормозить?

    В качестве решения предлагаю изменить тип поля на TEXT и добавить CHECK, а также индекс по значению.

    CREATE TABLE test (
        id INT PRIMARY KEY,
        data TEXT CHECK (JSON_VALID(data)), 
        INDEX idx_data (data(100))   -- подогнать до разумного
    );

    DEMO (см. время выполнения запросов).
    Ответ написан
    Комментировать
  • Как исправить долгое выполнение запросов на большой таблице?

    sharp97
    @sharp97
    не фонтан но брызги есть
    Согласен с Ипатьевым, вам надо сносить JSON и делать таблицы и связи по человечески и всё будет норм
    Ответ написан
    3 комментария
  • Как исправить долгое выполнение запросов на большой таблице?

    Adamos
    @Adamos
    Только вчера чистил битриксовскую b_form_result_answer, где за пять лет набежало 10 миллионов записей.
    Как это сделано в Битриксе:
    - таблица result, где пишется, кто заполнил форму, и ее идентификатор
    - таблица списка полей формы по ее идентификатору
    - таблица заполненных полей с идентификатором поля и ответа
    Да, тоже неторопливо, когда нужно поискать что-то, потому что постоянно приходится джойнить.
    Но уж не JSON.

    А задача повторов, действительно, решается просто хэшем, о чем вам сразу специалист и сказал.
    Ответ написан
    1 комментарий
  • Как сделать SQL запрос из двух таблиц?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В синтаксисе MySQL:
    SELECT c.name category_name, p.id post_id, p.name post_name, p.title post_title
    FROM posts p
    JOIN categories c ON p.category_id = c.id
    UNION ALL
    SELECT name, NULL, NULL, NULL
    FROM categories 
    ORDER BY category_name, post_id IS NOT NULL

    Соответственно если в поле post_id обнаруживается NULL, то в этой записи категория, и она рисуется как категория. Если же там не NULL - то это пост, и он рисуется со смещением.

    Дурь, конечно, но для сельской местности сойдёт..
    Ответ написан
    1 комментарий
  • Как сделать SQL запрос из двух таблиц?

    Если данных в каждой категории немного - то оверхед от дублирования в каждой строке результата небольшой, и ответ Vindicar прекрасен.
    Если оверхед большой, то:
    1. получаете первым запросом категории,
    2. сохраняете в какую-то структуру, где ключом служит id категории,
    3. выбираете посты одним запросом, с фильтром по id нужных категорий,
    4. в процессе разбора результатов этого запроса, распихиваете посты сразу по нужным категориям.
    Ответ написан
    1 комментарий
  • Как сделать SQL запрос из двух таблиц?

    Vindicar
    @Vindicar
    RTFM!
    Чем не устраивает
    SELECT * FROM Categories LEFT JOIN Posts ON Posts.category_id = Categories.id ORDER BY Categories.id ASC

    ?
    Тогда посты из одной категории будут идти последовательно. Запоминаешь категорию предыдущего поста, при обработке следующего поста сравниваешь. Если не совпадает - закрываешь теги для предыдущей категории, открываешь теги для новой категории.
    Ответ написан
    3 комментария
  • Как сделать SQL запрос из двух таблиц?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Пока на ум приходит получить все категории, потом в цикле пройтись по ним и...

    Естественно это не делается так. Такие задачи решаются на стороне бд через джоин таблиц. Не считая ошибки синтаксиса и отсутствия лимита, запрос в ответе Vindicar подойдет. Схема хранения не самая лучшая, так как по сути у вас получается один-ко-многим (одна категория ко многим постам), и если категорий на 1 пост будет больше 1, вся структура идет в мусор. Более качественным решением все же будет многие-ко-многим между постами и категориями.
    Ответ написан
    1 комментарий