每日一句:虽然你没有我前女友漂亮 但我一见到你就有种想跟你定下来的感觉
Mysql中除了常用的开发过程中使用到的DML、DCL等常用功能之外,还有一些高级特性,也可以帮助实现高性能的查询以及在某些场景下更好的使用Mysql
分区表
定义:分区表是一个独立的逻辑表,底层是多个物理表组成。简单来说,就是创建一个分区表,这个分区表将原本数据量很大的数据表根据某个字段进行分区,分到不同的磁盘文件中存储,在查询的时候可以直接去对应的分区查询,相对于在大表中查询,更快速
适用场景:在查询一个大表的时候非常慢,并且该表中只有部分为热点数据,那么如何进行优化呢?在不删除历史数据的情况下,主要有3种方式:1. 分库分表 2. 分区表 3.将历史数据迁移到备份表(在历史数据不会使用的情况下)
-
分库分表
常见的解决方案,良好的扩展性,可以解决数据量过大的问题以及单机Mysql容量问题。提高查询性能,只是会让系统更复杂,需要做一个额外的业务代码或者中间层代理来实现
-
分区表
由Mysql来对表进行分区,系统不会变的复杂,由Mysql中需要维护分区表,根据指定的字段分区,查询的时候会根据分区键到分区表查询,不会查询大表而是由分区表来控制查询指定的分区
-
历史数据迁移备份表
大表的历史数据如果不使用的情况下, 可以将历史数据迁移到备份表中来减小当前表的数据量,增加查询速度。但是如果历史数据都是有用的数据,则无法迁移
分区表的类型
-
RANGE分区
根据范围进行分区,每个分区存储的是指定范围的数据
create table sales ( create_time datetime NOT NULL, .... ) ENGINE = InnoDB PARTITION By RANGE(YEAR(create_time)) ( PARTITION p1 VALUES LESS THAN (2010), PARTITION p2 VALUES LESS THAN (2011), PARTITION p3 VALUES LESS THAN (MAXVALUE) );
根据
create_time
进行分区,最后一个分区是将大于2011的所有数据都保存到该分区中。查询时根据
create_time
查询分区表的效率会更高 -
Hash分区
如果如果时间等范围来作为分区的分区键,那么可以使用Hash分区,将指定的字段进行hash,然后根据hash值进行分区
CREATE TABLE test ( id INT NOT NULL, ... ) ENGINE = InnoDB