DB - MySQL 5.7
У меня есть относительно большая таблица, которую нужно объединить самостоятельно, основываясь на «иерархическом» индексе.
Итак присоединяемое поле 'id' - VARCHAR и выглядит как 1/222 1/222/333 1/222/444 1/222/444/555
Команда создания таблицы:
CREATE TABLE `referrals` (
`id` varchar(60) NOT NULL,
`level` int(11) NOT NULL DEFAULT '1',
`commission` decimal(32,16) NOT NULL DEFAULT '0.0000000000000000',
`commission_currency_id` varchar(10) NOT NULL,
PRIMARY KEY (`id`,`level`,`commission_currency_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Для извлечения данных на основе уровня я планировал использовать команду типа:
-- Does not utilize the index
select r1.id,
sum(r1.commission),
sum(r2.commission) as commissionAcc,
from referrals r1
left join referrals r2
on r2.id like concat(r1.id, '/%')
where r1.id like concat('10000', '/%') and r1.`level` = 1
group by r1.id
limit 10;
Я неожиданно обнаружил, что левые рефералы соединения r2 на r2.id похожи на concat (r1.id, '/%' ) просто не используйте индекс. Но если я заменю r1.id на строку в выражении like, используются индексы
-- Utilizes the index
select r1.id,
sum(r1.commission),
sum(r2.commission) as commissionAcc,
from referrals r1
left join referrals r2
on r2.id like concat('10000/10001', '/%')
where r1.id like concat('10000', '/%') and r1.`level` = 1
group by r1.id
limit 10;
Я просто не понимаю, почему. Я также попробовал:
-- Does not utilize the index
left join referrals r2
on left(r2.id, 6) = r1.id
Безуспешно. Индекс силы тоже не помогает. Единственное решение, которое я вижу, - это создание логики c, зависящей от генерируемых столбцов, но такой подход займет много места.
Есть ли обходные пути, которые нужно сделать MySQL, чтобы использовать индексы в этот случай? Заранее спасибо.