1

Ich habe eine Tabelle company, die eine Spalte namens country_id hat ist eine Referenz von country Tabelle Primärschlüssel-ID.MySQL - Verbesserung der Leistung für Multi-Länder

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; 

In dieser Tabelle hat mehrere Unternehmen für mehrere Länder. Wie die folgende Tabelle.

enter image description here

Meine company Tabelle hat riesige Daten. Ich möchte die Select-Abfrage auf company Tabelle Leistung basierend auf Land verbessern. Wählen Sie Abfrage wird wie

select * from company where country_id = 2 

Was wird die beste Design-Ansatz sein? Muss ich die Indizierung auf country_id Spalte hinzufügen oder muss ich die Partitionierung basierend auf der country_id Spalte tun? Bitte vorschlagen.

+0

Wenn diese Tabelle ist schreibgeschützt (außer einmal-in-a-while Admin-Zweck) können Sie MyISAM für diese Tabelle verwenden; Leseperformances sind auf unserem Setup für diese Art von Tabelle verbessert – Preuk

+0

@ Preuk, das ist keine schreibgeschützte Tabelle. In diese Tabelle werden fortlaufend Daten eingefügt. Aber ich bevorzuge es, die Select-Abfrage zu verbessern. – Suvonkar

+0

Wenn Sie nur zwei Tabellen haben, von denen nur eine riesige (Über Millionen von Re-Records) und kleine Tabelle (Max 200 Datensätze) ist, warum sind Sie nicht Denormaliz Ihre Tabelle, solange sowohl country.id und country.name sind einzigartig – Jay

Antwort

0

Wenn Sie eine große Anzahl von Ländern haben (mehr als 100), sollten Sie den Index verwenden.

Wenn wenige Länder in Ihrer Datenbank wäre besser Partitionierung zu verwenden.
Aber diese Option hat einen großen Nachteil. Wenn Sie ein neues Land hinzufügen, sollten Sie eine neue Partition hinzufügen, die mit einer neuen verknüpft ist.

0

InnoDB generiert automatisch einen Index für Ihren Fremdschlüssel country_id, so dass Sie ihn nicht indexieren müssen. Über Partition unterstützt InnoDB keinen Fremdschlüssel und Partition zusammen. Wenn Sie Partition verwenden, können Sie einfach einen Index für country_id (kein Fremdschlüssel) erstellen und beide Tabellen bei Bedarf ergänzen. Wenn Sie mehr als eine Million Datensätze auf company haben und Ihre Frage ist nicht schnell genug, können Sie Partition verwenden, wie unten:

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; 
Verwandte Themen