计算机教程

当前位置:澳门娱乐场网址 > 计算机教程 > 实现千万级数据的分页显示--整理资料并测试

实现千万级数据的分页显示--整理资料并测试

来源:http://www.ablakeforum.com 作者:澳门娱乐场网址 时间:2019-12-12 00:20

由于工作的原因:上家公司的数据库全采用MySQL,所以不得不用它。因此也学到了MySQL的一些知识,但考虑到今后可能没机会使用了,所以想趁现在离职在家休息,打算把这些东西整理一下,也为了万一今后能用上,留个参考的资源。考虑到一直在使用SQL Server,所以就打算直接与SQL Server对比来写。

原帖子如下:

本文将主要列出MySQL与SQL Server不同的地方,且以常用的存储过程的相关内容为主。

澳门娱乐场网址 1澳门娱乐场网址 2/**//*
澳门娱乐场网址 3 名称:spAll_DeleteNoneUnique
澳门娱乐场网址 4 输入:要查询的表名和字段列表
澳门娱乐场网址 5 输出:
澳门娱乐场网址 6 调用:
澳门娱乐场网址 7 说明:实现千万级数据的分页显示!--可以在5秒内获取1448万条记录里的第1200页的100条记录,雄不?
澳门娱乐场网址 8 作者:铁拳
澳门娱乐场网址 9 邮件:
澳门娱乐场网址 10 网站:http://www.wellknow.net
澳门娱乐场网址 11 更新:20040610
澳门娱乐场网址 12 支持:http://bbs.wellknow.net
澳门娱乐场网址 13 版权:转述时请注明来源:用思维创造未来的Wellknow.net
澳门娱乐场网址 14*/
澳门娱乐场网址 15
澳门娱乐场网址 16CREATE PROCEDURE GetRecordFromPage
澳门娱乐场网址 17    @tblName      varchar(255),       -- 表名
澳门娱乐场网址 18    @fldName      varchar(255),       -- 字段名
澳门娱乐场网址 19    @PageSize     int = 10,           -- 页尺寸
澳门娱乐场网址 20    @PageIndex    int = 1,            -- 页码
澳门娱乐场网址 21    @IsCount      bit = 0,            -- 返回记录总数, 非 0 值则返回
澳门娱乐场网址 22    @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序
澳门娱乐场网址 23    @strWhere     varchar(1000) = ''  -- 查询条件 (注意: 不要加 where)
澳门娱乐场网址 24AS
澳门娱乐场网址 25
澳门娱乐场网址 26declare @strSQL   varchar(6000)       -- 主语句
澳门娱乐场网址 27declare @strTmp   varchar(100)        -- 临时变量
澳门娱乐场网址 28declare @strOrder varchar(400)        -- 排序类型
澳门娱乐场网址 29
澳门娱乐场网址 30if @OrderType != 0
澳门娱乐场网址 31begin
澳门娱乐场网址 32    set @strTmp = "<(select min"
澳门娱乐场网址 33    set @strOrder = " order by ["   @fldName  "] desc"
澳门娱乐场网址 34end
澳门娱乐场网址 35else
澳门娱乐场网址 36begin
澳门娱乐场网址 37    set @strTmp = ">(select max"
澳门娱乐场网址 38澳门娱乐场网址,    set @strOrder = " order by ["   @fldName  "] asc"
澳门娱乐场网址 39end
澳门娱乐场网址 40
澳门娱乐场网址 41set @strSQL = "select top "   str(@PageSize)   " * from ["
澳门娱乐场网址 42      @tblName   "] where ["   @fldName   "]"   @strTmp   "(["
澳门娱乐场网址 43      @fldName   "]) from (select top "   str((@PageIndex-1)*@PageSize)   " ["
澳门娱乐场网址 44      @fldName   "] from ["   @tblName   "]"   @strOrder   ") as tblTmp)"
澳门娱乐场网址 45      @strOrder
澳门娱乐场网址 46
澳门娱乐场网址 47if @strWhere != ''
澳门娱乐场网址 48    set @strSQL = "select top "   str(@PageSize)   " * from ["
澳门娱乐场网址 49          @tblName   "] where ["   @fldName   "]"   @strTmp   "(["
澳门娱乐场网址 50          @fldName   "]) from (select top "   str((@PageIndex-1)*@PageSize)   " ["
澳门娱乐场网址 51          @fldName   "] from ["   @tblName   "] where "   @strWhere   " "
澳门娱乐场网址 52          @strOrder   ") as tblTmp) and "   @strWhere   " "   @strOrder
澳门娱乐场网址 53
澳门娱乐场网址 54if @PageIndex = 1
澳门娱乐场网址 55begin
澳门娱乐场网址 56    set @strTmp = ""
澳门娱乐场网址 57    if @strWhere != ''
澳门娱乐场网址 58        set @strTmp = " where "   @strWhere
澳门娱乐场网址 59
澳门娱乐场网址 60    set @strSQL = "select top "   str(@PageSize)   " * from ["
澳门娱乐场网址 61          @tblName   "]"   @strTmp   " "   @strOrder
澳门娱乐场网址 62end
澳门娱乐场网址 63
澳门娱乐场网址 64if @IsCount != 0
澳门娱乐场网址 65    set @strSQL = "select count(*) as Total from ["   @tblName   "]"
澳门娱乐场网址 66
澳门娱乐场网址 67exec (@strSQL)
澳门娱乐场网址 68
澳门娱乐场网址 69GO
澳门娱乐场网址 70
澳门娱乐场网址 71

  1. 标识符限定符

修改后,便于使用的代码:

数据库 标识符限定符
SQL Server []
MySQL ``

澳门娱乐场网址 72修改一点点便于其他人使用 
澳门娱乐场网址 73CREATE PROCEDURE GetRecordFromPage 
澳门娱乐场网址 74@tblName varchar(255), -- 表名 
澳门娱乐场网址 75@fldName varchar(255), -- 字段名 
澳门娱乐场网址 76@OrderfldName varchar(255), -- 排序字段名 
澳门娱乐场网址 77@StatfldName varchar(255), -- 统计字段名 
澳门娱乐场网址 78@PageSize int = 10, -- 页尺寸 
澳门娱乐场网址 79@PageIndex int = 1, -- 页码 
澳门娱乐场网址 80@IsCount bit = 0, -- 返回记录总数, 非 0 值则返回 
澳门娱乐场网址 81@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序 
澳门娱乐场网址 82@strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where) 
澳门娱乐场网址 83AS 
澳门娱乐场网址 84
澳门娱乐场网址 85declare @strSQL varchar(6000) -- 主语句 
澳门娱乐场网址 86declare @strTmp varchar(100) -- 临时变量 
澳门娱乐场网址 87declare @strOrder varchar(400) -- 排序类型 
澳门娱乐场网址 88
澳门娱乐场网址 89if @OrderType != 0 
澳门娱乐场网址 90begin 
澳门娱乐场网址 91set @strTmp = "<(select min" 
澳门娱乐场网址 92set @strOrder = " order by ["   @OrderfldName  "] desc" 
澳门娱乐场网址 93end 
澳门娱乐场网址 94else 
澳门娱乐场网址 95begin 
澳门娱乐场网址 96set @strTmp = ">(select max" 
澳门娱乐场网址 97set @strOrder = " order by ["   @OrderfldName  "] asc" 
澳门娱乐场网址 98end 
澳门娱乐场网址 99
澳门娱乐场网址 100set @strSQL = "select top "   str(@PageSize)   " "   @fldName   " from [" 
澳门娱乐场网址 101  @tblName   "] where ["   @OrderfldName   "]"   @strTmp   "([" 
澳门娱乐场网址 102  @OrderfldName   "]) from (select top "   str((@PageIndex-1)*@PageSize)   " [" 
澳门娱乐场网址 103  @OrderfldName   "] from ["   @tblName   "]"   @strOrder   ") as tblTmp)" 
澳门娱乐场网址 104  @strOrder 
澳门娱乐场网址 105
澳门娱乐场网址 106if @strWhere != '' 
澳门娱乐场网址 107set @strSQL = "select top "   str(@PageSize)   " "   @fldName   " from [" 
澳门娱乐场网址 108  @tblName   "] where ["   @OrderfldName   "]"   @strTmp   "([" 
澳门娱乐场网址 109  @OrderfldName   "]) from (select top "   str((@PageIndex-1)*@PageSize)   " [" 
澳门娱乐场网址 110  @OrderfldName   "] from ["   @tblName   "] where "   @strWhere   " " 
澳门娱乐场网址 111  @strOrder   ") as tblTmp) and "   @strWhere   " "   @strOrder 
澳门娱乐场网址 112
澳门娱乐场网址 113if @PageIndex = 1 
澳门娱乐场网址 114begin 
澳门娱乐场网址 115set @strTmp = "" 
澳门娱乐场网址 116if @strWhere != '' 
澳门娱乐场网址 117set @strTmp = " where "   @strWhere 
澳门娱乐场网址 118
澳门娱乐场网址 119set @strSQL = "select top "   str(@PageSize)   " "   @fldName   " from [" 
澳门娱乐场网址 120  @tblName   "]"   @strTmp   " "   @strOrder 
澳门娱乐场网址 121end 
澳门娱乐场网址 122
澳门娱乐场网址 123if @IsCount != 0 
澳门娱乐场网址 124set @strSQL = "select count("   @StatfldName   ") as Total from ["   @tblName   "]" 
澳门娱乐场网址 125
澳门娱乐场网址 126exec (@strSQL) 
澳门娱乐场网址 127
澳门娱乐场网址 128GO 
澳门娱乐场网址 129

  1. 字符串相加

说明:
增加了下面两个部分,其他人拷贝去可根据自己需要进行设定。
@OrderfldName varchar(255), -- 排序字段名
@StatfldName varchar(255), -- 统计字段名

数据库 字符串相加
SQL Server 直接用
MySQL concat()

fldName作用由排序转变为控制需要打开的字段。
@fldName varchar(255), -- 字段名

  1. isnull()

----------------------------------------------
个人测试结果:
通过测试,性能并没有原帖子所说的好。但这可能是机器原因,要知道,在SQL Server中,2千万条空记录大约要占用3G左右的空间,而插入这2千万条记录,在我的测试平台上耗费了近10个小时,内存占用从125M增长到350M左右。我实际测试了一下,在建立索引的情况下,执行一次根据主键,返回一条记录的查询,在512M内存,2.2G CPU,20G单分区存储数据库文件,100M局域网的配置情况下,平均大约需要15s左右(这只是我的个人测试,不具有任何实质性意义。)。

数据库 isnull()
SQL Server isnull()
MySQL ifnull()

另外我发现,对于上述配置的机器,运行SQL Server时,在百万级别以下的表中执行查询--(索引良好,没有坏点,或者最新索引),速度差别不大,但达到8位数以上,也就是千万以上时候,SQL Server表现就不太好了,当然,这与机器配置有很大关系了。但无可否认,SQL Server  2000还不是企业级数据库的最佳选择,在Oracle执行类似的查询,性能要好于SQL Server。插入执行完毕的时间是4个小时,内存占用一直没有变化:400M。执行相同查询,需要的时间是10s左右。

注意:MySQL也有isnull()函数,但意义不一样

小弟最近忙于一个公积金项目,对于部门数据库、中央数据库的调度进行了一些评估,Oracle软件+SUN/HP的硬件仍然占了中国政府机构服务器的大部分市场,再就是IBM,占据了高端和甚高端的大部分业务。

  1. getdate()

微软在这方面打个胜仗,还有很长的路要走--个人认为,和硬件公司合作研发相配套硬件是不二法门。

数据库 getdate()
SQL Server getdate()
MySQL now()

  1. newid()

数据库 newid()
SQL Server newid()
MySQL uuid()

  1. @@ROWCOUNT

数据库 @@ROWCOUNT
SQL Server @@ROWCOUNT
MySQL row_count()

注意:MySQL的这个函数仅对于update, insert, delete有效

  1. SCOPE_IDENTITY()

数据库 SCOPE_IDENTITY()
SQL Server SCOPE_IDENTITY()
MySQL last_insert_id()

本文由澳门娱乐场网址发布于计算机教程,转载请注明出处:实现千万级数据的分页显示--整理资料并测试

关键词:

上一篇:怎么用U盘重装系统?

下一篇:没有了