宠物店网站开发文档撰写,建设银行上海分行招聘网站,wordpress多功能模板,银行做网站视频分区表是什么分区表就是把一张表的数据#xff0c;按照设置好的条件#xff0c;单独存储在磁盘的不同位置#xff0c;也就是不同分区的数据是独立的#xff0c;互不影响的。在没有分区表的情况下#xff0c;一张表的数据就是存储在一个文件中#xff0c;用了分区表之后按照设置好的条件单独存储在磁盘的不同位置也就是不同分区的数据是独立的互不影响的。在没有分区表的情况下一张表的数据就是存储在一个文件中用了分区表之后单张表的数据会在硬盘上分开存储。对表的操作来说没有什么区别。分区表的优点更少的数据检索范围拆分超级大的表将部分数据加载至内存分区表的数据更容易维护分区表数据文件可以分布在不同的硬盘上并发 IO减少锁的范围避免大表锁表可独立备份恢复分区数据什么时候创建分区表当单张表的数据量较大且因为数据量大导致查询无法满足要求。不想做分库分表这样大的改动。未创建分区表的情况看下如果不创建分区表查询是怎么样的可以和创建分区表的情况做对比这样更好理解。CREATE TABLE test_partition ( id int(11) NOT NULL, create_time datetime NOT NULL, cyear int, PRIMARY KEY (id,create_time , cyear) ) ENGINEInnoDB DEFAULT CHARSETutf8; insert into test_partition values (1,20130722000000,2013); insert into test_partition values (2,20140722000000,2014); insert into test_partition values (3,20150722000000,2015); insert into test_partition values (4,20160722000000,2016); insert into test_partition values (5,20170722000000,2017); insert into test_partition values (6,20180722000000,2018); insert into test_partition values (7,20190722000000,2019); insert into test_partition values (8,20200722000000,2020); insert into test_partition values (9,20210722000000,2021); insert into test_partition values (10,20220722000000,2022);执行上面的SQL创建表并插入记录。查询年份大于2016的记录语句如下这个查询如果想优化首先想到的就是在年份字段上添加索引因为年份字段作为查询条件的一个字段。但实际操作就会发现添加了索引最终查询并没有使用这个索引因为MySQL执行器会推断当结果集的数量占总记录数的比例较大时不会使用索引因为无论是否使用索引扫描的记录总数差不多。解决方法就是在磁盘的检索范围上进行优化那就是创建分区表来解决。分区表的创建执行下面的语句可以删除上面创建的表重新创建带有分区的表。drop table test_partition; CREATE TABLE test_partition ( id int(11) NOT NULL, create_time datetime NOT NULL, cyear int, PRIMARY KEY (id,create_time , cyear) ) ENGINEInnoDB DEFAULT CHARSETutf8 PARTITION BY RANGE (cyear) ( PARTITION y14before VALUES LESS THAN (2014) , PARTITION y15 VALUES LESS THAN (2015) , PARTITION y16 VALUES LESS THAN (2016) , PARTITION y17 VALUES LESS THAN (2017) , PARTITION y18 VALUES LESS THAN (2018) , PARTITION y19 VALUES LESS THAN (2019) , PARTITION y20 VALUES LESS THAN (2020) , PARTITION y20after VALUES LESS THAN maxvalue );PARTITION BY RANGE 表示根据字段进行范围分区。PARTITION就是分区表的关键字y15代表分区的名称LESS THAN条件。当进行数据插入时年份为2015年的数据就会存储在y15这个分区中。年份为2016的数据就会存储在y16这个分区中。以此类推。分区表的使用插入数据insert into test_partition values (1,20130722000000,2013); insert into test_partition values (2,20140722000000,2014); insert into test_partition values (3,20150722000000,2015); insert into test_partition values (4,20160722000000,2016); insert into test_partition values (5,20170722000000,2017); insert into test_partition values (6,20180722000000,2018); insert into test_partition values (7,20190722000000,2019); insert into test_partition values (8,20200722000000,2020); insert into test_partition values (9,20210722000000,2021); insert into test_partition values (10,20220722000000,2022);可以看到在数据库安装目录的data目录中test这个文件夹下面有这样一些文件这就是test数据库中test_partition表的不同分区数据。文件名称对应的就是表名称分区的名称。在进行查询时MySQL会根据查询条件从指定的分区表中获取数据。这样就缩小了数据的检索范围。查询这个执行计划可以看到partitions字段值就是数据涉及到的分区名称。MySQL只去查找涉及到的分区然后从中获取数据并不会把所有表数据全部去扫描从物理层面减少扫描范围。因为查询条件是年份大于2016所以只查询2017及其之后年份的数据2017年的数据存储在y18的分区中所有就可以看到y18,y19,y20after这三个分区。分区表数据统计通过下面的查询可以看到表的每个分区中数据分布情况select PARTITION_NAME as 分区, TABLE_ROWS as 行数 from information_schema.partitions where table_schematest #数据库名称 and table_nametest_partition; #表名分区表的使用限制查询必须包含分区列上面例子中的cyear列不允许对分区列进行计算。分区列必须是数字类型。分区表不支持建立外键索引。建表时主键必须包含所有的列上面例子中PRIMARY KEY (id,create_time , cyear)。最多1024个分区。