Индекс не работает должным образом при объединении таблиц с двумя разными механизмами (TokuDB и InnoDB) - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь объединить две таблицы на двух разных движках. Один на Innodb, а другой на Tokudb.

Запрос выглядит примерно так:

select * from table1 t1, table2 t2 where t1.a = t2.x and t1.b = 'xyz';

Здесь table1 имеет столбцы (проиндексированные), b (проиндексированные), c и имеет механизм innodb
, в то время как table2 имеет столбцы x (indexed), y, z и имеет механизм tokudb

Он просматривает все строки таблицы2 и используя тип соединения: ALL

Результат объяснения запроса

id  select_type table partitions type   possible_keys   key   key_len ref     rows  filtered    Extra
1   SIMPLE      t1    NULL       const  b,a             b     303     const   1     100.00      NULL
1   SIMPLE      t2    NULL       ALL    NULL            NULL  NULL    NULL    20687 100.00      Using where

Как вы можете видеть, он сканирует всю таблицу2. Я что-то здесь упускаю? или это потому, что он объединяет два разных движка?

Создать синтаксис таблицы

table1

CREATE TABLE `table1` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT
  `a` varchar(255) DEFAULT NULL,
  `b` varchar(255) DEFAULT NULL,
  `c` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `a` (`a`),
  UNIQUE KEY `b` (`b`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

table2

CREATE TABLE `table2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `x` varchar(100) DEFAULT NULL,
  `y` varchar(100) DEFAULT NULL,
  `z` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `x` (`x`)
) ENGINE=TokuDB DEFAULT CHARSET=latin1;

1 Ответ

1 голос
/ 29 января 2020

Используйте то же самое CHARACTER SET при присоединении:

) ENGINE=InnoDB DEFAULT CHARSET=utf8;
) ENGINE=TokuDB DEFAULT CHARSET=latin1;
                                ^^^^^^
...