mysql的高效存取过程分页

来源:互联网 发布:找常熟淘宝仓库工作 编辑:程序博客网 时间:2024/04/25 23:05

 10w以上数据的效率比普通分页 快4-5倍

 

PROCEDURE p_pageList (m_pageNo int , m_perPageCnt int , m_indexcolumn varchar(100), m_column varchar(1000) , m_table varchar(1000) , m_condition varchar(1000), m_orderBy varchar(200) , inout m_totalPageCnt int)
BEGIN

IF m_totalPageCnt >=1 THEN
 SET @sqlCnt = CONCAT('select count(1) into @pageCnt from ',m_table); -- 这条语句很关键,用来得到总数值
 IF m_condition IS NOT NULL AND m_condition <> '' THEN
  SET @sqlCnt = CONCAT(@sqlCnt,' where ',m_condition);
 END IF;
 PREPARE s_cnt from @sqlCnt;
 EXECUTE s_cnt;
 DEALLOCATE PREPARE s_cnt;
 SET m_totalPageCnt = @pageCnt;
else
 SET @pageCnt = 1; -- 总记录数
 SET @limitStart = (m_pageNo - 1)*m_perPageCnt;
 SET @limitEnd = m_perPageCnt;
 SET @sql = CONCAT('select ',m_column,' from ',m_table);  -- 主查询
 SET @wsql = CONCAT('select ',m_indexcolumn,' from ',m_table);  -- 子查询
 IF m_condition IS NOT NULL AND m_condition <> '' THEN
 SET @sql = CONCAT(@sql,' where ',m_condition);
 SET @wsql = CONCAT(@wsql,' where ',m_condition);
 END IF;


 IF  @limitStart<1000 THEN
  IF m_orderBy IS NOT NULL AND m_orderBy <> '' THEN
  SET @sql = CONCAT(@sql,' order by ',m_orderBy);
  END IF;
  SET @sql = CONCAT(@sql, ' limit ', @limitStart, ',', @limitEnd);
 Else
  IF m_orderBy IS NOT NULL AND m_orderBy <> '' THEN
   SET @wsql = CONCAT(@wsql,' order by ',m_orderBy);
   IF m_condition IS NOT NULL AND m_condition <> '' THEN
    SET @sql = CONCAT(@sql,' and ', m_indexcolumn ,'>=(',@wsql, ' limit ', @limitStart,',1) ' ,' order by ', m_orderBy, ' limit ',@limitEnd);
   else
    SET @sql = CONCAT(@sql,' where ', m_indexcolumn ,'>=(',@wsql, ' limit ', @limitStart,',1) ' , ' order by ',m_orderBy, ' limit ',@limitEnd);
   END IF;
  Else
   IF m_condition IS NOT NULL AND m_condition <> '' THEN
    SET @sql = CONCAT(@sql,' and ', m_indexcolumn ,'>=(',@wsql, ' limit ', @limitStart,',1) ' , ' limit ',@limitEnd);
   else
    SET @sql = CONCAT(@sql,' where ', m_indexcolumn ,'>=(',@wsql, ' limit ', @limitStart,',1) ' , ' limit ',@limitEnd);
   END IF;
  END IF;
 END IF;

 PREPARE record from @sql;
 EXECUTE record;
 DEALLOCATE PREPARE record;

 

/*

select @sql;
*/

 

 

 

END IF;
END

原创粉丝点击