分页查询,你真的懂吗?
来源:互联网 发布:pg数据库 知乎 编辑:程序博客网 时间:2024/06/13 16:03
CREATE TABLE 收藏表(
`id` bigint(20) unsigned NOT NULL auto_increment COMMENT
'primary key'
,
`uid` bigint(20) unsigned NOT NULL
default
0 COMMENT
'uid'
,<br> `status` tinyint(3) unsigned NOT NULL
default
0 COMMENT
'status'
,
`book_id` bigint(20) unsigned NOT NULL
default
0 COMMENT
'book Id'
,
`create_time` int(11) unsigned not null
default
0 COMMENT
'create time'
,
PRIMARY KEY (`id`),
UNIQUE KEY `uid_book_id` (`uid`, `book_id`),<br> KEY `uid_status` (`uid`, `status`)
)ENGINED=Innodb Auto_increment=1
default
charset=gbk COMMENT
'用户收藏信息'
;
最容易想到的第一种分页语句是(这也是我们最容易想到的语句):
select distinct uid from 收藏表 order by uid desc limit 0, 10;
select distinct uid from 收藏表 order by uid desc limit 11, 10;
再高级点语句,第二种($last_min_uid表示上一次读到的最后一个uid):
select distinct uid from 收藏表 order by uid desc limit 10;
select distinct uid from 收藏表 where uid <
$last_min_uid
order by uid desc limit 10;
最高级的方式
select uid from 收藏表 group by uid order by uid desc limit 10;
select uid from 收藏表 group by uid having uid <
$last_min_uid
order by uid desc limit 10;
以上三种方式都可以实现分页获取到用户ID列表,那么区别是什么?我现在就把每一种跟大家分析下。
第一种在业务场景中,会出现丢数据的情况。——这是比较严重的情况,不予采纳。
具体的业务场景是这样的:当你读取第5页的时候,前四页的用户id列表中,假如有一页的用户ID从库中删除掉,那么你这时读到的第5页(limit 51, 10),就是原来的第6页,你会把1页的用户ID丢失掉。
第二种的第二条语句,通过explain分析,实际并没有命中唯一索引,而只是命中了一般索引,数据查询范围在7百万级别,故explain建议我们使用group by。——这个查询会有严重的性能问题。
+----+--------------+---------------+-------+-------------------------------------------------------------+-------------+----------+-------+------------+------------------------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------+---------------+-------+-------------------------------------------------------------+---------------------+---------+------+---------+---------------------------------------------------------------------+
| 1 | SIMPLE | ubook_room | range | uid_book_id | uid_status | 4 | NULL | 7066423 | Using where; Using index for group-by; Using temporary; Using filesort |
+----+--------------+---------------+-------+-------------------------------------------------------------+-------------+----------+-------+------------+------------------------------------------------------------------------+
第三种explain分析,数据查询范围在12万级别(跟第二种相差一个数量级),查询性能高。
+----+---------------+------------+-------+-----------------+-----------------+---------+----------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+---------------+------------+-------+-----------------+-----------------+---------+----------+----------+-------------+
| 1 | SIMPLE | 收藏表 | index | NULL | uid_book_id | 12 | NULL | 121719 | Using index |
+----+---------------+------------+-------+-----------------+-----------------+---------+----------+----------+-------------+
- 分页查询,你真的懂吗?
- 你真的懂吗
- 你真的真的懂了吗?
- 讲真,你真的懂JDBC吗?
- 讲真,你真的懂JDBC吗?
- 你真的懂javascript吗
- 亲,你真的懂国际化吗?
- 五险一金,你真的懂吗
- 你真的懂defer了吗?
- 你真的懂【售罄率】吗?
- jdk,jre你真的懂吗?
- jdk,jre你真的懂吗?
- 你真的懂GCD吗?
- 你真的懂字节对齐吗?
- jdk,jre你真的懂吗?
- float你真的懂了吗
- 你真的懂select吗??
- 社群你真的懂吗?
- Ubuntu 安装Nginx
- 深入理解TCP(二)
- 数据总线
- 2016年计划,2015年总结
- 优秀工作流引擎标准
- 分页查询,你真的懂吗?
- <1>拜耳阵列
- ACCESS网站示例-连载-母版设计
- [Android] Android SDK 安装代理设置
- [Android Studio]常见Execution failed for task
- 前端开发入门:前端构建工具gulp入门教程
- RelativeLayout注册点击事件
- android material design 之elevation,tinting,clipping
- leetcode Wiggle Sort II