выберите запрос для таблицы с множеством строк (250 м + рядов) - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть оператор выбора, который занимает некоторое время (очень много времени) для завершения MySQL.Все таблицы "MyISAM".Версия MySQL 5.6.41.

У меня есть три таблицы

  • таблица 1: 50000 строк
  • таблица 2: 7500000 строк (7,5 ГБ)
  • таблица 3: 250 000 000 строк (17,5 ГБ)

Я выполняю оператор выбора с левыми объединениями в таблице.

select `table1`.* 
from `table1`  
inner join `table2` on `table2`.`table1_id` = `table1`.`id` 
inner join `table3` on `table3`.`table2_id` = `table2`.`id` 
where `table1`.`id` = "2" and `table3`.`parameter` = 'param' 

столбцы "id"к первичным ключам и столбцу «параметр» применен индекс

Код текущей таблицы

CREATE TABLE `table1` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`), 
    INDEX `id` (`id`), 
)
COLLATE='utf8_unicode_ci'
ENGINE=MyISAM;

CREATE TABLE `table2` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `table1_id` INT(10) UNSIGNED NOT NULL,
    PRIMARY KEY (`id`), 
    INDEX `id` (`id`), 
    INDEX `table1_id_index` (`table1_id`),
)
COLLATE='utf8_unicode_ci'
ENGINE=MyISAM;


CREATE TABLE `table3` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `table2_id` INT(10) UNSIGNED NOT NULL,
    `parameter` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
    PRIMARY KEY (`id`), 
    INDEX `id` (`id`), 
    INDEX `id` (`parameter`), 
    INDEX `table2_id_index` (`table1_id`),
)
COLLATE='utf8_unicode_ci'
ENGINE=MyISAM;

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

select `table1`.* 
from `table3`  
inner join `table2` on `table3`.`table2_id` = `table2`.`id` 
inner join `table1` on `table2`.`table1_id` = `table1`.`id` 
where `table1`.`id` = "2" and `table3`.`parameter` = 'param' 

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Переключиться на InnoDB.Он «группирует» PRIMARY KEY с данными, таким образом избегая нескольких случайных поисков, от которых вы страдаете с MyISAM.

Между тем, каково значение key_buffer_size?Сколько у вас оперативной памяти?

0 голосов
/ 29 ноября 2018

убедитесь, что у вас есть правильный индекс для идентификатора и убедитесь, что вы не выполняете бесполезное преобразование данных и для

create index  idx1 on table2 (table1_id, id) 
create index  idx2 on table3 (table2_id, parameter)
...