当我们的数据库的数据达到一定量级(百万,千万)的时候,一般会首先考虑对数据库进行性能调优,那我们拿到一个数据应该如何对其进行优化呢?
是分表、分库、怎么分,用什么策略吗?分表分库又能提高多大的性能呢?
要回答上面的问题,首先我们得解决一个问题:数据库的物理存储结构
我们平常在设计数据库的时候,一般只需要建库、建表、数据的增删改查等等这些,其实这个是数据库的逻辑结构
而要对数据库优化必须了解它的物理结构,因为所有的数据操作都是针对物理结构的。
数据文件
数据库文件是指数据库中用来存放数据库和数控对象的文件,一个数据库可以有一个或多个数据库文件,一个数据库文件只能属于一个数据库,
当多个数据库文件时,有一个文件被定为主数据文件,用来存储数据库的启动信息和部分或全部数据,数据文件则划分为不同的区域
页是sql server存储数据的基本单位。
2014版中,页的大小是8kb,每个页可分为页头、数据行和行偏移矩阵。
页头 存储有关页的系统信息,所属文件号,页面编号等
数据行 就是存数据的了,一个所有列都是固定长度的表,在每个页上存储的行数总是相同的
行偏移矩阵 是2字节组成的块,每个2字节表示相应的数据行开始的偏移。每条记录对应一个2字节项。
8个连续的页组成的数据结构称为 盘区,2014版中有两种类型的盘区,如图所示:
统一区:由单个对象(表,或索引等)所有,区中的8页只能由所属对象使用
混合区:最多有8个对象共享,每个页可以由不同对象所有
数据行的结构
先是所有的固定长度的列,然后是所有变长列,对于每一个定长或变长数据,都是按照建表是的列顺序来存储的
定长记录的存储
变长记录的存储
注意,数据行存储在页中,但数据页只能包含除text、ntext和image数据外的数据,这些数据存储在单独的页中。
数据行不能跨页存储,而每页最大时8kb,所以每行数据最大时8kb
日志文件:
sqlserver的日志文件是由一系列的日志记录组成,而不是页。日志文件记录了存储数据库的更新情况等事务日志信息,用户对数据库进行的插入、删除、更新等操作都会记录在日志文件中。
当数据库损坏时,可以根据日志文件分析出错的原因,或者数据丢失时,还可以使用事务日志恢复数据库。每个数据库至少拥有一个日志文件。
总结:把数据库比作一个书架,每本书就相当于一个盘区,书中的页就是数据库的数据页,也有页码页面注释这些信息,每行字就是数据行。一个表的数据可能会占用几页,甚至几本书。
欸,会不会数据库的作者就是参考书架的这种思想来设计的!
Positive people are lucky people, they can see the roses while others see only the thorns