@Kumatoz48

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

Есть сервер MySQL 8 версии. В простой БД два поля - id и data. У поля data тип JSON. В нем хранятся данные, получаемые из нескольких форм. Т. е. данные из формы преобразуются в JSON и сохраняются в БД.

Проблема в том, что данных планируется довольно много. При тестировании простейшего запроса

SELECT * FROM table WHERE data = "{'field1':'value', 'field2':'value','field3':'value'.....}"

в случае, когда записей в таблице порядка 10 миллионов время выполнения запроса на локальной машине составляет в районе 30 секунд. Есть ли способы ускорить или посоветуйте варианты, возможно вся логика неправильная и можно сделать более грамотно.
  • Вопрос задан
  • 219 просмотров
Решения вопроса 2
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
возможно вся логика неправильная и можно сделать более грамотно.


Штирлиц шел по Берлину, и не мог понять, что выдавало в нем русского шпиона - то ли рация за спиной, то ли волочащийся сзади парашют, то ли болтающийся на груди ППШ.

когда записей в таблице порядка 10 миллионов время выполнения запроса


ВНЕЗАПНО оказалось, что если использовать микроскоп для забивания гвоздей, то в него становится почему-то плохо видно.

В простой БД два поля - id и data. У поля data тип JSON. В нем хранятся данные, получаемые из нескольких форм.


Но вы же, когда эту, с позволения сказать, "базу данных" проектировали, ведь радовались своему остроумию и хитрости? Зачем проектировать структуру базы данных, делать какие-то таблицы, между таблицами связи. потом сложные запросы писать? Если можно хопа, и в джейсон все кучей навалить!

Ну вот и продолжайте радоваться дальше.

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

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

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

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

А задача повторов, действительно, решается просто хэшем, о чем вам сразу специалист и сказал.
Ответ написан
sharp97
@sharp97
не фонтан но брызги есть
Согласен с Ипатьевым, вам надо сносить JSON и делать таблицы и связи по человечески и всё будет норм
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы