1

У меня есть таблица company, которая имеет столбец под названием country_id является ссылкой country таблица с основным ключом.MySQL - Улучшение производительности для нескольких стран

CREATE TABLE `company` (
    `Id` INT(11) NOT NULL, 
    `Name` VARCHAR(100) NOT NULL, 
    `Symbol` VARCHAR(50) NOT NULL, 
    `Industry` VARCHAR(100) NOT NULL, 
    `Type` VARCHAR(20) NOT NULL, 
    'country_id' INT(11) NOT NULL, 
    PRIMARY KEY (`Id`), 
    CONSTRAINT `company_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `country` (`Id`) 
) 
COLLATE='latin1_swedish_ci' 
ENGINE=InnoDB; 

В этой таблице представлено несколько компаний для нескольких стран. Как и нижеприведенная таблица.

enter image description here

Моя company таблица имеет огромные данные. Я хочу, чтобы улучшить запрос выбора на company производительность таблицы по стране. Выбрать запрос будет

select * from company where country_id = 2 

Какой будет лучший подход к дизайну? Нужно ли добавлять индексирование на столбец country_id или мне нужно сделать разбиение на основе столбца country_id? Пожалуйста, предложите.

+0

Если эта таблица только для чтения (за один раз-в-время, за исключением admin), вы можете использовать MyISAM для этой таблицы; улучшенные показатели чтения в нашей настройке для такого типа таблицы – Preuk

+0

@Preuk, это не таблица только для чтения. Непрерывные данные вставляются в эту таблицу. Но я предпочитаю улучшать выбор запроса. – Suvonkar

+0

Если у вас есть только две таблицы, которые только из них огромны (более миллиона рекордов) и небольшой стол (макс. 200 записей), почему вы не используете Denormaliz для своей таблицы, пока оба country.id и country.name UNIQUE – Jay

ответ

0

Если у вас есть большое количество стран (более 100), вы должны использовать индекс.

Если несколько стран в вашей БД лучше использовать разметку.
Но этот вариант имеет один большой недостаток. Если вы добавите новую страну, вы должны добавить новый раздел, связанный с новым.

0

InnoDB автоматически генерирует индекс по вашему внешнему ключу country_id, поэтому вам не нужно индексировать его. О разделе, InnoDB не поддерживает внешний ключ и раздел вместе, и если вы используете раздел, вы можете просто создать индекс на country_id (не внешний ключ) и присоединиться к обеим таблицам, если вам нужно. Если у вас есть более одного миллиона записей на company и ваш запрос не достаточно быстро, вы можете использовать раздел, как показано ниже:

CREATE TABLE `company` (
     `Id` INT(11) NOT NULL, 
     `Name` VARCHAR(100) NOT NULL, 
     `Symbol` VARCHAR(50) NOT NULL, 
     `Industry` VARCHAR(100) NOT NULL, 
     `Type` VARCHAR(20) NOT NULL, 
     `country_id` INT(11) NOT NULL, 
     PRIMARY KEY (`Id`), 
     INDEX (`country_id`) 
    ) 

PARTITION BY RANGE (`country_id`) (
    PARTITION P1 VALUES LESS THAN (20), 
    PARTITION P2 VALUES LESS THAN (50), 
    PARTITION P3 VALUES LESS THAN (100), 
    PARTITION P4 VALUES LESS THAN MAXVALUE) 

    COLLATE='latin1_swedish_ci' 
    ENGINE=InnoDB;