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都是唯一的,为什么不对表进行反规范化呢