MySQL优化分库分表,为什么要分表,分表以后如何进行排序查询,业务如何设计?

昨天面试新人的时候,遇到了这么一个问题,按照自己的想法大体聊了一些,但大多是感性的,并没有完整的了解why and how.

今天查了一些相关的资料,包括《MySQL性能调优与架构设计》、《高性能Mysql》,慢慢的整体理解,请大家指正。

之一,为什么要分表?

分表,按形式,有水平分表和主附分表。
水平分表常见于按ID取模或者按日期将相同表结构的内容散列到不同的表上,主附分表常见于有对应关系的多张表,通过主外键进行关联。

1,解决磁盘系统最大文件限制

如大家所知,各文件系统对单个文件大小的限制是不一样的。
虽然在现代网站架构设计中,这个问题基本上不用考虑,但在面试时,如果能回答上来这点,可以让体现出较不错的计算机基础功底。
FAT16(最大分区2GB,最大文件2GB ,最大容量?)
FAT32(最大分区32GB,最大容量2TB,最大文件32G)
NTFS(最大分区2TB,最大容量,最大文件2TB)
ext3(最大文件大小: 2TB,最大文件极限: 仅受文件系统大小限制,最大分区/文件系统大小: 4TB,最大文件名长度: 255 字符)

2,减少增量数据写入时的锁对查询的影响,减少长时间查询造成的表锁,影响写入操作等锁竞争的情况
数据越来越多,查询逻辑比较复杂的情况下,可能造成表锁和行锁,会影响到正常的读写需求,如果把数据进行分表,典型的情况有按ID和日期进行分表,读取旧数据和写入新数据的操作在不同的表里,这样就可以避免单张表间产生的锁竞争,节省排队的时间开支,增加呑吐量。
需要注意的是,这里说的减少锁和排队的时间开支,并没有确切的说减少了cpu的运算开支,因为分表以后的运算需求还可能在同一台设备上。如果使用了分库分表则能取得更好的运算速度提升。

3,同2,由于单表数量下降,常见的查询操作由于减少了需要扫描的记录,使得单表单次查询所需的检索行数变少,减少了磁盘IO,时延变短。