百万条数据分页

1 篇文章 0 订阅

写出代码之前,先说明一下原理,比较简单。有一张表(test)如下 
结构是:id(自动编号) txt   (假设40条记录)
现在要每页显示10条记录,则每页要显示的数据应该是:
第一页:1----10
第二页:11----20
第三页:21----30
第四页:31----40

如要显示第一页,最简单的方法就是 select top 10 * from test 就OK了。

第二页开始呢?怎么做呢?请接着看:
比如我要显示第三页:也就是21----30
原理:找出不要的数据也就是1----20,最大的id,这是里20
再找出大于这个id(20) 前10条记录就OK了。

原理知道后写代码就简单了,不懂看

<asp:LinkButton id="lbtnFirst" Runat="server">首頁</asp:LinkButton>
<asp:LinkButton id="lbtnBack" Runat="server">上頁</asp:LinkButton>
<asp:LinkButton id="lbtnNext" Runat="server">下頁</asp:LinkButton>
<asp:LinkButton id="lbtnLast" Runat="server">尾頁</asp:LinkButton>
<asp:Label id="Label1" runat="server">当前页:</asp:Label>
<asp:Label id="lblCurrentPage" runat="server">1</asp:Label>
<asp:Label id="Label2" runat="server">总页:</asp:Label>
<asp:Label id="lblPageCount" runat="server">200</asp:Label>
<asp:Label id="Label3" runat="server">跳转:</asp:Label>
<asp:TextBox id="txtToPage" runat="server" Width="88px"></asp:TextBox>
<asp:Button id="btnToPage" runat="server" Text="go"></asp:Button>
<asp:DataGrid id="DataGrid1" runat="server" AllowPaging="True" AllowCustomPaging="True"></asp:DataGrid>

后台代码:

private void Page_Load(object sender, System.EventArgs e)
  {
   if (!Page.IsPostBack)
   {
    //开始显示第一页
    ShowDate(Convert.ToInt64(lblCurrentPage.Text));
   }
  }

  /// <summary>
  /// 显示数据
  /// </summary>
  /// <param name="page"></param>
  private void ShowDate(long page)
  {
        
           
   /*-------------------设置参数------------------*/

   string tblName  = "test";
   string fldName  = "id";
   string orderStr = "asc";
   int  PageSize = 10;
    
   /*-------------------设置结束------------------*/

   byte[] t =Convert.FromBase64String(System.Configuration.ConfigurationSettings.AppSettings["conStr"]);

   string conStr = System.Text.ASCIIEncoding.ASCII.GetString(t);


   SqlConnection conn = new SqlConnection(conStr);
   conn.Open();
   SqlCommand cmd = new SqlCommand("select count(*) from " + tblName,conn);
   lblPageCount.Text = Convert.ToString(((int)cmd.ExecuteScalar() / PageSize + 1));
   DataGrid1.VirtualItemCount = Convert.ToInt32(lblPageCount.Text);//datadrid每次就显示一页,所有要手动加上总页
   
   string sql = string.Empty;

   sql = "select top " + Convert.ToString((page - 1) * PageSize) + " " + fldName + " from " + tblName +  " order by " + fldName + " " + orderStr; //排除的记录部分
   sql = "select max (" + fldName + ") from ( " + sql + " ) as t"; //得到排除记录里的最大ID号
   sql = "select top " + PageSize.ToString() + " * from " + tblName + " where " + fldName + ">(" + sql + ") order by " + fldName + " " + orderStr;
   
   if (page == 1){sql = "select top " + PageSize + " * from " + tblName;lblCurrentPage.Text = "1";}

   try
   {
    SqlDataAdapter da = new SqlDataAdapter(sql,conn);
    System.Data.DataSet ds = new DataSet();
    da.Fill(ds);
    DataGrid1.DataSource = ds.Tables[0].DefaultView;
    DataGrid1.DataBind();  

    conn.Close();

   }
   catch ( Exception ex)
   {
    Response.Write(ex.Message.ToString());
   }
   
  }

  /// 首页
  private void lbtnFirst_Click(object sender, System.EventArgs e)
  {
   lblCurrentPage.Text = "1";
   ShowDate(1);
  }

  /// 上页
  private void lbtnBack_Click(object sender, System.EventArgs e)
  {
   if (lblCurrentPage.Text != "1")
   {
    lblCurrentPage.Text = Convert.ToString(Convert.ToInt64(lblCurrentPage.Text) - 1);
    ShowDate(Convert.ToInt64(lblCurrentPage.Text));
   }
  }

  /// 下页
  private void lbtnNext_Click(object sender, System.EventArgs e)
  {
   if (lblCurrentPage.Text != lblPageCount.Text)
   {
    lblCurrentPage.Text = Convert.ToString(Convert.ToInt64(lblCurrentPage.Text) + 1);
    ShowDate(Convert.ToInt64(lblCurrentPage.Text));
   }
  }

  /// 尾页
  private void lbtnLast_Click(object sender, System.EventArgs e)
  {
   lblCurrentPage.Text = lblPageCount.Text;
   ShowDate(Convert.ToInt64(lblPageCount.Text));
  }

  /// 跳转
  private void btnToPage_Click(object sender, System.EventArgs e)
  {
   if ( Convert.ToInt64(txtToPage.Text.Trim()) > 0 && Convert.ToInt64(txtToPage.Text.Trim()) < Convert.ToInt64(lblPageCount.Text))
   {
    lblCurrentPage.Text = txtToPage.Text;
    ShowDate(Convert.ToInt64(txtToPage.Text));
   }
  }

  /// dataGrid单击的页数
  private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
  {
   DataGrid1.CurrentPageIndex = e.NewPageIndex;
   lblCurrentPage.Text = Convert.ToString(e.NewPageIndex + 1);
   ShowDate(e.NewPageIndex + 1);
  }

 

亲自测试sql2000 460万条记录,显示速度很快
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当MySQL数据库中存在上百万条数据时,数据库优化变得尤为重要。以下是一些可以考虑的优化方法: 1. 索引优化:对经常查询的字段创建索引,以加快数据检索和过滤的速度。同时,避免创建过多无用的索引,以减少数据插入和修改时的开销。 2. 查询优化:使用合适的查询语句,避免不必要的全表扫描。可以使用索引、分页查询等方式来提高查询性能。 3. 分区和分表:将数据按照不同件进行分区或者分表存储,可以减少单个表中数据的数量,提高查询和操作的效率。 4. 缓存优化:使用缓存技术,如Redis或Memcached,在查询频繁但数据更新不频繁的场景下,减少对数据库的访问,提高响应速度。 5. 内存调优:通过调整和优化MySQL的内存设置,如缓冲池大小、缓存大小等,可以加快数据读写速度,提升性能。 6. 查询缓存:MySQL自带的查询缓存可以将查询结果缓存在内存中,提高查询效率。但在高并发环境下,可能会导致缓存失效率较高,需要慎重使用。 7. 数据库分离:将数据库的读写分离,使用主从复制的方式,可以提升并发读取的能力。 8. 避免使用SELECT *:尽可能指定需要查询的字段,避免不必要的数据传输和资源消耗。 9. 定期清理无用数据:定期清理过时或无用的数据,以减少数据量,提高数据库的维护和查询效率。 总之,针对MySQL百万条数据的优化,需要综合考虑索引、查询、缓存、内存等方面,通过合理的配置和优化手段,使数据库能够更高效地处理大量数据,提升系统的整体性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值