V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  ihuotui  ›  全部回复第 46 页 / 共 47 页
回复总数  931
1 ... 38  39  40  41  42  43  44  45  46  47  
看你数据量吧,建议看看我提供的资料
Mysql 的分页查询语句的性能分析


  MySql 分页 sql 语句,如果和 MSSQL 的 TOP 语法相比,那么 MySQL 的 LIMIT 语法要显得优雅了许多。使用它来分页是再自然不过的事情了。

2.1 最基本的分页方式:

Sql 代码 收藏代码

SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...

在中小数据量的情况下,这样的 SQL 足够用了,唯一需要注意的问题就是确保使用了索引:
举例来说,如果实际 SQL 类似下面语句,那么在 category_id, id 两列上建立复合索引比较好:

Sql 代码 收藏代码
SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 50, 10


2.2 子查询的分页方式:

随着数据量的增加,页数会越来越多,查看后几页的 SQL 就可能类似:
Sql 代码 收藏代码
SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 10

一言以蔽之,就是越往后分页, LIMIT 语句的偏移量就会越大,速度也会明显变慢。
此时,我们可以通过子查询的方式来提高分页效率,大致如下:
Sql 代码 收藏代码
SELECT * FROM articles WHERE id >=
(SELECT id FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) LIMIT 10


2.3JOIN 分页方式

Sql 代码 收藏代码
SELECT * FROM `content` AS t1
JOIN (SELECT id FROM `content` ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) AS t2
WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT $pagesize;

经过我的测试, join 分页和子查询分页的效率基本在一个等级上,消耗的时间也基本一致。
explain SQL 语句:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> system NULL NULL NULL NULL 1
1 PRIMARY t1 range PRIMARY PRIMARY 4 NULL 6264 Using where
2 DERIVED content index NULL PRIMARY 4 NULL 27085 Using index

----------------------------------------

为什么会这样呢?因为子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。

实际可以利用类似策略模式的方式去处理分页,比如判断如果是一百页以内,就使用最基本的分页方式,大于一百页,则使用子查询的分页方式。
2016-04-27 20:01:13 +08:00
回复了 peiweichen 创建的主题 酷工作 [深圳南山][A 轮][互联网招聘 15k~40k]
@peiweichen 发简历没有回应?
2016-04-25 15:47:59 +08:00
回复了 csdreamdong 创建的主题 问与答 session 到底是什么鬼,有没有比较形象的解释。。0 0.
能共享,要自己实现。
2016-04-25 15:38:13 +08:00
回复了 peiweichen 创建的主题 酷工作 [深圳南山][A 轮][互联网招聘 15k~40k]
语言不限,诗词歌赋都可以。哈哈
2016-04-24 21:50:43 +08:00
回复了 Blotimer 创建的主题 Apple Web 开发的话是选 MBA 还是 MBP13 呢
建设升级硬盘吧。
2016-04-24 21:50:18 +08:00
回复了 Blotimer 创建的主题 Apple Web 开发的话是选 MBA 还是 MBP13 呢
性能没有区别,就是屏幕区别,在公司反正都会拓展的,在家也拓展,不能拓展的地方就不工作啦,还愁啥了。
@pimin 最佳回复奖
2016-04-23 23:11:57 +08:00
回复了 ihuotui 创建的主题 问与答 自己写商城的项目,要怎么写? java 的。
@kslr 已经过了那个年纪了,想好好思考。
2016-04-23 21:23:49 +08:00
回复了 coldear 创建的主题 程序员 由于你们代码上的 bug 所造成的最大的经济损失是多少?
公司上市机会,哈哈
2016-04-23 20:34:04 +08:00
回复了 ihuotui 创建的主题 问与答 自己写商城的项目,要怎么写? java 的。
@avichen 不做大而全的那种,只是小型的。也不做太具体的,如果有商业再具体开发。做做基本功能。
2016-04-23 20:23:30 +08:00
回复了 ihuotui 创建的主题 问与答 自己写商城的项目,要怎么写? java 的。
@avichen 算不算造轮子呢。。哈哈
2016-04-23 20:21:24 +08:00
回复了 ihuotui 创建的主题 问与答 自己写商城的项目,要怎么写? java 的。
@avichen ,顺便完善自己的能力,上个创业公司搞了商品平台,但是不够好, 还有就是商品那块设计还考虑的不够好,暂时看的好的设计 http://www.cnblogs.com/mmmjiang13/archive/2012/07/05/2575538.html
2016-04-23 20:18:19 +08:00
回复了 ihuotui 创建的主题 问与答 自己写商城的项目,要怎么写? java 的。
@avichen 个人业余项目,未来看机会可能提供商业化。
2016-04-23 20:06:01 +08:00
回复了 ihuotui 创建的主题 问与答 自己写商城的项目,要怎么写? java 的。
@avichen 要不要考虑分库分表的?
2016-04-23 16:19:58 +08:00
回复了 sysitem 创建的主题 问与答 一本考不上 想学计算机编程专业 有什么大学可以推荐吗?
大城市,然后去看书写程序一年,然后出来工作,然后毕业有 3 年经验。能成为真正的程序员了。
2016-04-22 16:21:42 +08:00
回复了 Myprincess 创建的主题 职场话题 一次纠结的应聘经历,我应该怎么办?(二)
其实是把风险放在你身上,收益就在他们。
无本创业,谁想创业谁付出,谁承担风险。
100%按照市场工资计算。不是就别去了。
马丁富勒的重构相关书籍
2016-04-17 12:56:02 +08:00
回复了 stabc 创建的主题 MacBook Pro 有没有自己换过 C 壳的同学?麻烦么?
换过,还是可以弄的。有点累。
1 ... 38  39  40  41  42  43  44  45  46  47  
关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2639 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 29ms · UTC 10:34 · PVG 18:34 · LAX 03:34 · JFK 06:34
Developed with CodeLauncher
♥ Do have faith in what you're doing.