我必须得告诉大家的MySQL优化原理(2)

在可以思考一个问题,如果数据量非常大的情况下,您根据业务选择了合适的字段,精心设计了表和索引,还仔细的检查了所有的SQL,并确认已经没什么问题,但性能仍然不能满足您的要求,该怎么办呢?还有其他优化策略吗?答案是肯定的。

接下来继续和您讨论一些常用的MySQL高级特性以及其背后的工作原理。

分区表
合理的使用索引可以极大提升MySQL的查询性能,但如果单表数据量达到一定的程度,索引就无法起作用,因为在数据量超大的情况下,除非覆盖索引,因回表查询会产生大量的随机I/O,数据库的响应时间可能会达到不可接受的程度。

而且索引维护(磁盘空间、I/O操作)的代价也会非常大。

因此,当单表数据量达到一定程度时(在MySQL4.x时代,MyISAM存储引擎业内公认的性能拐点是500W行,MySQL5.x时代的性能拐点则为1KW ~ 2KW行级别,具体需根据实际情况测试),为了提升性能,最为常用的方法就是分表。

分表的策略可以是垂直拆分(比如:不同订单状态的订单拆分到不同的表),也可以是水平拆分(比如:按月将订单拆分到不同表)。

但总的来说,分表可以看作是从业务角度来解决大数据量问题,它在一定程度上可以提升性能,但也大大提升了编码的复杂度,有过这种经历的同学可能深有体会。

在业务层分表大大增加了编码的复杂程度,而且处理数据库的相关代码会大量散落在应用各处,维护困难。

那是否可以将分表的逻辑抽象出来,统一处理,这样业务层就不用关心底层是否分表,只需要专注在业务即可。

答案当然是肯定的,目前有非常多的数据库中间件都可以屏蔽分表后的细节,让业务层像查询单表一样查询分表后的数据。如果再将抽象的逻辑下移到数据库的服务层,就是我们今天要讲的分区表。

你可能感兴趣的:(我必须得告诉大家的MySQL优化原理(2))