MySQL-提高多国应用程序的性能

MySQL-提高多国应用程序的性能,mysql,database,mysql-workbench,lamp,database-administration,Mysql,Database,Mysql Workbench,Lamp,Database Administration,我有一个表company,它有一个名为country\u id的列,是country表主键id的引用 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, 'co

我有一个表
company
,它有一个名为
country\u id
的列,是
country
表主键id的引用

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;
此表中有多个国家/地区的多个公司。如下表所示

我的
公司
表有大量数据。我想改进基于国家/地区的
公司
表性能的select查询。选择查询将像

 select * from company where country_id = 2

最好的设计方法是什么?我需要在
country\u id
列上添加索引,还是需要根据
country\u id
列进行分区?请建议。

如果您有大量国家(超过100个),您应该使用索引

如果数据库中的国家数量很少,则最好使用分区。

但这种选择有一个很大的缺点。如果您要添加新的国家,您应该添加链接到新分区的新分区

如果你有很多国家(超过100个),你应该使用索引

如果数据库中的国家数量很少,则最好使用分区。

但这种选择有一个很大的缺点。如果您要添加新的国家,您应该添加链接到新分区的新分区

InnoDB将自动为您的外键生成索引
country\u id
,因此您无需对其进行索引。 关于分区,InnoDB不支持同时使用外键和分区,如果您使用分区,您只需在
country\u id
(非外键)上创建一个索引,并在需要时连接两个表。 如果您在
公司
上有超过一百万条记录,并且您的查询速度不够快,您可以使用分区,如下所示:

    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;

InnoDB将自动为您的外键
国家/地区id
生成索引,因此您无需对其进行索引。 关于分区,InnoDB不支持同时使用外键和分区,如果您使用分区,您只需在
country\u id
(非外键)上创建一个索引,并在需要时连接两个表。 如果您在
公司
上有超过一百万条记录,并且您的查询速度不够快,您可以使用分区,如下所示:

    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;

如果此表是只读的(除了在AN中同时管理的目的),您可以考虑使用MyISAM来对该表进行操作;在我们的设置中,这种类型的文件的读取性能得到了改进table@Preuk,这不是只读表。此表中不断插入数据。但我的偏好是改进select查询。如果您只有两个表,其中只有两个表是巨大的(超过数百万条重新记录)和一个小表(最多200条记录),那么只要country.id和country.name都是唯一的,为什么不将表反规范化如果该表是只读的(除了偶尔一次的管理目的)您可以考虑使用MyISAM来处理此表;在我们的设置中,这种类型的文件的读取性能得到了改进table@Preuk,这不是只读表。此表中不断插入数据。但我的偏好是改进select查询。如果您只有两个表,其中只有两个表是巨大的(超过数百万条重新记录)和小表(最多200条记录),那么只要country.id和country.name都是唯一的,为什么不对表进行反规范化呢