MySQL "присоединиться как" не использует INDEX - PullRequest
0 голосов
/ 20 апреля 2020

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, чтобы использовать индексы в этот случай? Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...