pageNow代表当前页面,第一页。
第一部分:看一下分页的基本原理:
对上面的mysql语句说明:limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。文中还提到limit n性能是没问题的,因为只扫描n行。
第二部分:根据雅虎的几位工程师带来了一篇Efficient Pagination Using MySQL的报告内容扩展:在文中提到一种clue的做法,给翻页提供一些线索,比如还是SELECT FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是1020,最小的是1000,如果我们只提供上一页、下一页这样的跳转(不提供到第N页的跳转),那么在处理上一页的时候SQL语句可以是:
处理下一页的时候SQL语句可以是:
不管翻多少页,每次查询只扫描20行。
缺点是只能提供上一页、下一页的链接形式,但是我们的产品经理非常喜欢“上一页 1 2 3 4 5 6 7 8 9 下一页”这样的链接方式,怎么办呢?
如果LIMIT m,n不可避免的话,要优化效率,只有尽可能的让m小一下,我们扩展前面的clue做法,还是SELECT FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是2519,最小的是2500;
当是第10页的SQL如下:
比如要跳到第9页,SQL语句可以这样写:
比如要跳到第8页,SQL语句可以这样写:
原理还是一样,记录住当前页id的最大值和最小值,计算跳转页面和当前页相对偏移,由于页面相近,这个偏移量不会很大,这样的话m值相对较小,大大减少扫描的行数。其实传统的limit m,n,相对的偏移一直是第一页,这样的话越翻到后面,效率越差,而上面给出的方法就没有这样的问题。
优化总结:
1任何情况下SELECT COUNT() FROM xxx 是最优选择;
2尽量减少SELECT COUNT() FROM xxx WHERE COL = ‘xxx’ 这种查询;
3杜绝SELECT COUNT(COL) FROM tablename WHERE COL = ‘xxx’ 的出现。(其中COL非主键)
环境:
MySQL版本:5045
OS:Windows XP SP3
数据表一:sphinx
+———-+——————+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+———-+——————+——+—–+———+—————-+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| til | varchar(100) | NO | | | |
| content | text | NO | | | |
| dataline | int(11) | NO | | | |
+———-+——————+——+—–+———+—————-+
记录数:1120100
查询一:
mysql> select count() as totalnum from sphinx;
+———-+
| totalnum |
+———-+
| 1120100 |
+———-+
1 row in set (000 sec)
查询二:
mysql> select count() as totalnum from sphinx where id>1000;
+———-+
| totalnum |
+———-+
| 1119100 |
+———-+
1 row in set (217 sec)
查询三:
mysql> select count() as totalnum from sphinx where id>1000;
+———-+
| totalnum |
+———-+
| 1119100 |
+———-+
1 row in set (061 sec)
查询四:
mysql> select count() as totalnum from sphinx where id>1000;
+———-+
| totalnum |
+———-+
| 1119100 |
+———-+
1 row in set (061 sec)
查询五:
mysql> select count(id) as totalnum from sphinx;
+———-+
| totalnum |
+———-+
| 1120100 |
+———-+
1 row in set (000 sec)
查询六:
mysql> select count(til) as totalnum from sphinx where id>1000;
+———-+
| totalnum |
+———-+
| 1119100 |
+———-+
1 row in set (1 min 3861 sec)
查询七:
mysql> select count(id) as totalnum from sphinx where id>11000;
+———-+
| totalnum |
+———-+
| 1109100 |
+———-+
1 row in set (061 sec)
查询八:
mysql> select count(id) as totalnum from sphinx;
+———-+
| totalnum |
+———-+
| 1120100 |
+———-+
1 row in set (003 sec)
结论:
在 select count() 没有 where 条件的时候 select count() 和 select count(col) 所消耗的查询时间相差无几。
在 select count() 有 where 条件的时候 select count(col) 所消耗的查询时间 比 select count() 明显多出数量级的时间。
欢迎转载,本文标题:MySQL count() 与 count(col) 查询效率比较
转载请注明原文网址:>
格式:select from 表 limit index,n 其中index是第几条,n显示多少条;
select from 表 limit 0,20 其实就做到分页显示了,意思是从第1条开始取20条,点下一页你修改select from 表 limit 19,20这就是第二页了,也显示20条
原料,mybatis的jar包,各种数据库的分页sql语句。
这就要看你是使用何种数据库了,因为有些数据库的分页实现可以更简单,比如MySql的limit关键字,而mybatis必须通过sql语句才能实现分页,所以在我们的<select>标签可以这样写:参数paramterType可以传一个封装了分页信息(比如当前页数,每页大小等)对象,如果是带条件的分页,可以将分页的对象和条件对象放入一个map中。然后在sql语句中就可以用#{}访问分页信息:
比如Mysql的分页:
select from Student limit #{pageSize(pageNo-1)} #{pageSize}
因为navicat分页,导致默认一页只能显示1000行,超出1000行就在下一页显示了,并不是存不进去数据,只是分页显示了,其实第一次已经添加成功了,点击右下方下一页就能看到添加的其他数据了。
为了防止之后出现类似问题,可以按如下图所示将限制行的对勾去掉即可。
扩展资料
MySQL数据库特性:
1. mySQL使用 C和 C++编写,并使用了多种编译器进行测试,保证了源代码的可移植性。
2.支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种 *** 作系统。
3.为多种编程语言提供了 API。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby,NET和 Tcl 等。
4.支持多线程,充分利用 CPU 资源。
5.优化的 SQL查询算法,有效地提高查询速度。
6.既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。
7.提供多语言支持,常见的编码如中文的 GB 2312、BIG5,日文的 Shift_JIS等都可以用作数据表名和数据列名。
8.提供 TCP/IP、ODBC 和 JDBC等多种数据库连接途径。
9.提供用于管理、检查、优化数据库 *** 作的管理工具。
10.支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
SQL Server 数据库中SQL语句查询分页数据的解决方案:
实例:要求选取tbllendlist中第3000页的记录,每一页100条记录。
方法1:
select top 100 from tbllendlist
where fldserialNo not in
(
select top 300100 fldserialNo from tbllendlist
order by fldserialNo
)
order by fldserialNo
方法2:
SELECT TOP 100
FROM tbllendlist
WHERE (fldserialNo >
(SELECT MAX(fldserialNo)
FROM (SELECT TOP 300100 fldserialNo
FROM tbllendlist
ORDER BY fldserialNo) AS T))
ORDER BY fldserialNo
方法1执行速度比较快!
SQL Server数据库
从数据库表中的第M条记录开始取N条记录,利用Top关键字:注意如果Select语句中既有top,又有order by,则是从排序好的结果集中选择:
SELECT
FROM ( SELECT Top N
FROM (SELECT Top (M + N - 1) FROM 表名称 Order by 主键 desc) t1 ) t2
Order by 主键 asc
例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:
SELECT
FROM ( SELECT TOP 20
FROM (SELECT TOP 29 FROM Sys_option order by sys_id desc) t1) t2
Order by sys_id asc
Oracle数据库
从数据库表中第M条记录开始检索N条记录
SELECT
FROM (SELECT ROWNUM r,t1 From 表名称 t1 where rownum < M + N) t2
where t2r >= M
例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:
SELECT
FROM (SELECT ROWNUM R,t1 From Sys_option where rownum < 30 ) t2
Where t2R >= 10
MySQL数据库
MySQL数据库最简单,是利用mysql的LIMIT函数,LIMIT [offset,] rows从数据库表中M条记录开始检索N条记录的语句为:SELECT FROM 表名称 LIMIT M,N。
例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:select from sys_option limit 10,20 。
关于Oracle、SQL Server、MySQL数据库分页查询的知识就介绍到这里了,希望本次的介绍能够对您有所帮助。
DB2分页查询
SELECT FROM (Select 字段1,字段2,字段3,rownumber() over(ORDER BY 排序用的列名 ASC) AS rn from 表名) AS a1 WHERE a1rn BETWEEN 10 AND 20
以上表示提取第10到20的纪录
select from (select rownumber() over(order by id asc ) as rowid from table where rowid <=endIndex )
where rowid > startIndex
1、直接使用跨库的多表联合查询。不建议。
2、向6台数据库server均发送一个查询请求,然后对所有查询结果进行汇总,再处理分页逻辑。
3、建立一个总数据库,只负责维护主键和必要的索引,以供分页查询。
4、使用redis维护一个主键序列,分页 *** 作就是截取该序列的一部分,其结果就是主键id集合。拿到id后便可以映射到多台mysql服务器上查询数据了。但毕竟数据被分布式存储了,取到完整结果集必须要多次、多台的数据库访问,这个肯定是避免不了。
注:“多台”数据库访问的问题无解,但同台“多次”数据库访问的问题可以通过程序优化。
以上就是关于MySql中查询语句实现分页功能全部的内容,包括:MySql中查询语句实现分页功能、mysql count 查询效率缓慢、例如:select * from 表 limit 0,20;怎么对MySQL查询到的数据在JSP页面上做分页,就是做真分页等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)