Оптимизировать скорость Mysql JOIN-запроса - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть 2 таблицы с именем T1, состоящие из 1,6 млн. Строк и T2, состоящие из 4,6 млн. Строк с отношением один-ко-многим.

CREATE STMT T1 - это:

CREATE TABLE `T1` (
  `field_1` text,
  `field_2` text,
  `field_3` decimal(10,6) DEFAULT NULL,
  `field_4` decimal(10,6) DEFAULT NULL,
  `field_4` decimal(10,6) DEFAULT NULL,
  `field_5` text,
  `field_6` text,
  `field_7` text,
  `field_8` double DEFAULT NULL,
  `field_9` text,
  `field_10` text,
  `field_11` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE STMT T2:

CREATE TABLE `T2` (
  `field_1` int(11) DEFAULT NULL,
  `field_2` text,
  `field_3` text,
  `field_4` text,
  `field_5` text,
  `field_6` text,
  `field_7` text,
  `field_8` text,
  `field_9` text,
  `field_10` text,
  `field_11` text,
  `field_12` text,
  `field_13` text
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

У меня нет индексов или каких-либо конкретных ограничений на данный момент, но T1.field_1 должен быть моим идеальным ключом, и его можно объединить с полем T2.field_2.

Если я решу создать JOIN, как:

SELECT * FROM T1
JOIN T2
ON T1.field_1=T2.field_2
WHERE T1.=2130100;

Тест действительно высокий,Это ОБЪЯСНЕНИЕ: explain

Итак, я просто пытаюсь понять, какие могут быть некоторые возможные улучшения:

  • Добавить индекс
  • Изменить тип полей ввода?
  • Может быть добавить первичный ключ?

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Если вы пропустили имя столбца, я предполагаю, что столбцы названы your_col

Начиная с формы mysql 5.0.3 varchar может работать до 65 535, так что вы можете попробовать использовать varchar вместо текста, когда это возможно

для индексации существуют ограничения на размер индекса. Максимальная длина ключа составляет 767 байт (при условии 3 байта для каждого символа utf8. Таким образом, около 250 символов utf8)

столбец-кандидат для индексации должен соблюдать эти ограничения если это возможно, то вы могли бы добавить индекс на

таблица t2 colums fiedl_2

и

table t1 a composite index on  column (Your_col, field_1) 

это столбцы, включенные в предложение where и ON

  SELECT * FROM T1
  JOIN T2
  ON T1.field_1=T2.field_2
  WHERE T1.Your_col=2130100;
0 голосов
/ 22 апреля 2019

Поскольку вы используете latin1, переключите t1.field_1 и t2.field_2 на VARCHAR не более 767. Используйте самое короткое значение, которое вряд ли будет превышено. Сделайте то же самое для всех остальных TEXT столбцов. (Если вам нужно> 767, придерживайтесь TEXT.)

Затем добавьте два индекса:

T1:  INDEX(??) -- whatever column you are using in the `WHERE`
T2:  INDEX(field_2)

Если столбец в T1 является INT, тогда 2130100 в порядке. Но если это TEXT (или скоро будет VARCHAR(..), то процитируйте его: "2130100". Это должно предотвратить неожиданное и ненужное сканирование таблицы T1.

...