Пишу запрос, постепенно его усложняя. На каждом шаге время выполнения увеличивается. Рост ожидаем, проблема в том, что он очень высок - на порядок. То есть, на втором шаге - 0.3с, на третьем - уже 3с (по данным профайлера).
Помогите понять, почему так быстро растет время запроса.
По существу. Есть две связанных таблицы, в первой - список уникальных наборов данных, во второй - сами данные в виде ключ->значение, каждая пара привязана к набору:
CREATE TABLE dataset
set_id INT PRIMARY KEY,
label TEXT;
CREATE TABLE keyvalue
id INT PRIMARY KEY,
set_id INT,
key varchar(10),
val int;
CREATE INDEX index_k_v ON keyval (set_id, key, val);
Запрос:
SELECT t.set_id as id, t1.val as key1, t2.val as key2, t3.val as key3 FROM dataset t
JOIN keyvalue t1 ON t1.key='key1' and t.set_id=t1.set_id
JOIN keyvalue t2 ON t2.key='key2' and t.set_id=t2.set_id -- 0.3s
JOIN keyvalue t3 ON t3.key='key3' and t.set_id=t3.set_id -- 3.0s
Ясно, что добавляется еще один проход, непонятно, почему он требует времени на порядок больше.
Профайлер говорил, что время занимало sending data (98%), поэтому, чтобы снять вопрос объема данных, в тестовой схеме поле val имеет тип INT, хотя картина осталась прежней. Замеры времени приведены для этой схемы.