Asp.Net网站优化系列之数据库优化分字诀分表(纵向拆分,横向分区)
2023-06-13 09:14:19 时间
1.纵向分表
纵向分表是指将一个有20列的表根据列拆分成两个表一个表10列一个表11列,这样单个表的容量就会减少很多,可以提高查询的性能,并在一定程度上减少锁行,锁表带来的性能损耗。
纵向分表的原则是什么呢,应该怎样拆分呢?答案是根据业务逻辑的需要来拆分,对于一张表如果业务上分两次访问某一张表其中一部分数据,那么就可以根据每次访问列的不同来做拆分;另外还可以根据列更新的频率来拆分,例如某些列每天要更新3次,有些列从创建开始基本上很少更新。
举例:
假定场景,我有一张用户表,这张表包含列:
ID,UserName,Password,RealName,Gender,Email,IsEmailValid,Birthday,Country,City,Address,Mobile,Phone,ZipCode,Hometown,OfficePhone,Company,Position,Industry,LatestLoginTime,LatestLoginIP,LoginTimes,OnlineMinutes
假定现在我们的登录出现了性能问题,用户登录经常出现数据库超时的现象。我们打算用拆表的方法解决这个问题。先看下涉及到登录的字段有:UserName,Password,LatestLoginTime,LatestLoginIP,LoginTimes;那么我们就可以以此为依据将原表拆分为:UserLogin和UserBase两个表,后者包含除了登录信息的其他列信息;两张表都要包含主键ID。
2.横向分区
横向分区是将表从行的角度拆分,例如将创建时间在05年之前的数据放在一个分区上,将05年到08年之间的数据放到另一个分区上,以此类推。横向分区所根据的列必须在聚集索引上,通常会根据时间,主键id等进行划分。
横向分区将数据划分为不同的区,在根据分区列条件进行查询时可以缩小查询的范围,从而提高查询的性能;另外如果数据库服务器有多个cpu,则可以通过并行操作获得更好的性能。
到底要根据那个列进行横向的分区和查询有关系,我们在建表的时候需要分析,会根据那个列进行查询。
举例:
1.订单是一个实效性很强的实体,我们很少查询几年前的订单数据,我们就可以在订单的创建时间列上创建分区函数来做分区。
2.比如帖子通常情况下只有在首页推荐的最新的帖子被访问次数很多,而几年前的帖子被访问的几率较小,这时候我们可以根据帖子的主键id来做分区,id小于300w的在一个分区上,id在300到600w之间的在一个分区上。
有关分区的更多信息,请参考高性能网站建设之MSSqlServer数据库分区
有关如何进行分区,请参考SqlServer分区演练
纵向分表是指将一个有20列的表根据列拆分成两个表一个表10列一个表11列,这样单个表的容量就会减少很多,可以提高查询的性能,并在一定程度上减少锁行,锁表带来的性能损耗。
纵向分表的原则是什么呢,应该怎样拆分呢?答案是根据业务逻辑的需要来拆分,对于一张表如果业务上分两次访问某一张表其中一部分数据,那么就可以根据每次访问列的不同来做拆分;另外还可以根据列更新的频率来拆分,例如某些列每天要更新3次,有些列从创建开始基本上很少更新。
举例:
假定场景,我有一张用户表,这张表包含列:
ID,UserName,Password,RealName,Gender,Email,IsEmailValid,Birthday,Country,City,Address,Mobile,Phone,ZipCode,Hometown,OfficePhone,Company,Position,Industry,LatestLoginTime,LatestLoginIP,LoginTimes,OnlineMinutes
假定现在我们的登录出现了性能问题,用户登录经常出现数据库超时的现象。我们打算用拆表的方法解决这个问题。先看下涉及到登录的字段有:UserName,Password,LatestLoginTime,LatestLoginIP,LoginTimes;那么我们就可以以此为依据将原表拆分为:UserLogin和UserBase两个表,后者包含除了登录信息的其他列信息;两张表都要包含主键ID。
2.横向分区
横向分区是将表从行的角度拆分,例如将创建时间在05年之前的数据放在一个分区上,将05年到08年之间的数据放到另一个分区上,以此类推。横向分区所根据的列必须在聚集索引上,通常会根据时间,主键id等进行划分。
横向分区将数据划分为不同的区,在根据分区列条件进行查询时可以缩小查询的范围,从而提高查询的性能;另外如果数据库服务器有多个cpu,则可以通过并行操作获得更好的性能。
到底要根据那个列进行横向的分区和查询有关系,我们在建表的时候需要分析,会根据那个列进行查询。
举例:
1.订单是一个实效性很强的实体,我们很少查询几年前的订单数据,我们就可以在订单的创建时间列上创建分区函数来做分区。
2.比如帖子通常情况下只有在首页推荐的最新的帖子被访问次数很多,而几年前的帖子被访问的几率较小,这时候我们可以根据帖子的主键id来做分区,id小于300w的在一个分区上,id在300到600w之间的在一个分区上。
有关分区的更多信息,请参考高性能网站建设之MSSqlServer数据库分区
有关如何进行分区,请参考SqlServer分区演练
相关文章
- Windows Server2012服务器安装SqlServer数据库和.NET Framework 3.5图文教程
- [.net]EF中重建数据库
- Oracle Database: The Ultimate Connection Guide for .NET Developers(net连接oracle)
- Net不再压着 MSSql,语音变得前景无限(net mssql语音)
- 基于NET技术的Oracle信息服务(.net用oracle)
- NET与Oracle结合出现新的可能(.net oracle)
- 数据库NET开发者操作Oracle数据库的全攻略(net操作oracle)
- 数据使用NET改变Oracle数据库的奥秘(net修改oracle)
- ASP无法连接MySQL数据库解决方案(asp连不上mysql)
- ASP动态连接MySQL数据库(asp 连mysql)
- 优雅地实现 ASP配置 Oracle 数据库(asp配置oracle)
- 数据库ASP连接Oracle数据库简单实现实时数据访问(asp连续oracle)
- asp.net跳转页面的三种方法比较
- ASP.NET封装的SQL数据库访问类
- asp.net连接数据库增加,修改,删除,查询代码
- VB.net查询获取数据库数据信息
- asp.net根据汉字的拼音首字母搜索数据库(附LINQ调用方法)
- Asp.Net网站优化系列之数据库的优化措施与索引优化方法
- asp.net中将数据库绑定到DataList控件的实现方法与实例代码
- asp.net通用的连接数据库实例代码
- 一个ASP.NET的MYSQL的数据库操作类自己封装的