mysql分页查询优化(索引延迟关联)
对于web后台报表导出是一种常见的功能点,实际对应服务后端即数据库的排序分页查询。如下示例为公司商户积分报表导出其中一个sql ,当大批量的导出请求进入时候,mysql的cpu急剧上升瞬间有拖垮库的风险。
SELECT
*
FROM
coupons.cp_score_log
WHERE
`m_shopid` = 40861
AND `add_time` BETWEEN 1483200000
AND 1544543999
ORDER BY
add_time DESC
LIMIT 118000 ,1000 ;
报表导出功能存在几个问题:
1、时间跨度太大,数据量剧增。(可以结合业务需求,限制一定时间范围,比如只能导出3个月以内数据)
2、DB方面没有限制并发。(需要dba一起参与)
3、sql未考虑LIMIT分页过大,查询性能问题。(索引延迟关联,本文重点 或者 限制分页上限)
运行结果:18.94s (结果受到机器峰值影响,可能低一些,可能更高)
sql执行计划 :
表结构:
CREATE TABLE `cp_score_log` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
......
`m_shopid` int(10) DEFAULT '' COMMENT '总店id',
......
`add_time` int(10) DEFAULT '',
`......PRIMARY KEY (`id`),
KEY `idx_cardno` (`card_no`),
KEY `idx_shopid` (`shopid`) USING BTREE,
KEY `idx_orderid` (`order_id`),
KEY `idx_shopid_add_time_score` (`shopid`,`add_time`,`score`),
KEY `idx_mshopid` (`m_shopid`,`add_time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=24130302 DEFAULT CHARSET=utf8 COMMENT='积分记录表'
表的数据基本在2400万左右未进行拆分,通过查看sql和执行计划发现已经命中索引【idx_mshopid】,但是查询效率仍然很低。抛开其他问题只针对sql来说,核心的问题出在LIMIT。
MySQL中 【LIMIT offset, m】并不是跳过offset然后取m行数据,而是直接取【offset+m】行数据,丢弃前offset行返回m行。因此查询的效率就特别的低,特别当offset特别大的时候。
针对上面提出第3点问题,可以考虑使用后索引延迟关联,即 通过建立中间表覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。 同时限制最大的分页数量,比如百度最大分页即为79页 。
SELECT
*
FROM
cp_score_log
INNER JOIN (
SELECT
id,
add_time
FROM
coupons.cp_score_log
WHERE
`m_shopid` = 40861
AND `add_time` BETWEEN 1483200000
AND 1544543999
ORDER BY
add_time DESC
LIMIT LIMIT 118000 ,1000
) b ON cp_score_log.id = b.id
ORDER BY
b.add_time DESC;
运行结果:0.7s (天差地别)
sql执行计划:
由此可见,使用sql延迟关联sql效率确实提升明显。但是并非能解决所以问题,当表数据过大已经数据库并发提高时,还是会出现查询慢甚至拖垮db当风险。所以因综合考虑,将请求量削峰。
mysql分页查询优化(索引延迟关联)的更多相关文章
- MySQL 分页查询优化——延迟关联优化
目录 1. InnoDB表的索引的几个概念 2. 覆盖索引和回表 3. 分页查询 4. 延迟关联优化 写在前面 下面的介绍均是在选用MySQL数据库和Innodb引擎的基础开展.我们先 ...
- MySQL性能优化之延迟关联
[背景] 某业务数据库load 报警异常,cpu usr 达到30-40 ,居高不下.使用工具查看数据库正在执行的sql ,排在前面的大部分是: SELECT id, cu_id, name, in ...
- MySQL 分页查询优化
有时在处理偏移量非常大的分页时候查询时,例如LIMIT 1000,10这样的查询,这时MySQL需要查询1010条记录然后只返回最后10条,前面1000条记录都被抛弃,这样的代价非常高.要优化这种查询 ...
- 复盘MySQL分页查询优化方案
一.前言 MySQL分页查询作为Java面试的一道高频面试题,这里有必要实践一下,毕竟实践出真知. 很多同学在做测试时苦于没有海量数据,官方其实是有一套测试库的. 二.模拟数据 这里模拟数据分2种情况 ...
- MySQL大数据分页的优化思路和索引延迟关联
之前上次在部门的分享会上,听了关于MySQL大数据的分页,即怎样使用limit offset,N来进行大数据的分页,现在做一个记录: 首先我们知道,limit offset,N的时候,MySQL的查询 ...
- 4种MySQL分页查询优化的方法,你知道几个?
前言 当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点.下面简单说一下我知道的 ...
- mysql分页查询优化
由于MySql的分页机制:并不是跳过 offset 行,而是取 offset + N 行,然后返回放弃前 offset 行,返回N 行, 所以当 offset 特别大的时候,效率就非常的低下,要么控制 ...
- mysql通过“延迟关联”进行limit分页查询优化的一个实例
最近在生产上遇见一个分页查询特别慢的问题,数据量大概有200万的样子,翻到最后一页性能很低,差不多得有4秒的样子才能出来整个页面,需要进行查询优化. 第一步,找到执行慢的sql,如下: SELECT ...
- mysql优化----大数据下的分页,延迟关联,索引与排序的关系,重复索引与冗余索引,索引碎片与维护
理想的索引,高效的索引建立考虑: :查询频繁度(哪几个字段经常查询就加上索引) :区分度要高 :索引长度要小 : 索引尽量能覆盖常用查询字段(如果把所有的列都加上索引,那么索引就会变得很大) : 索引 ...
随机推荐
- [转载]VS2013 密钥 – 所有版本
http://www.wxzzz.com/307.html Visual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9 Visu ...
- AngularJS入门基础——过滤器
在HTML中的模板绑定符号{{ }}内通过 | 符号来调用过滤器 {{ name | uppercase }} 以HTML的形式使用过滤器时,如果需要传递参数给过滤器,只要在过滤器名字后面加冒号即 ...
- python垃圾回收之分代回收
可参考vamei的博客和https://www.jianshu.com/p/1e375fb40506
- 洛谷 P4389: 付公主的背包
题目传送门:洛谷 P4389. 题意简述: 有 \(n\) 个物品,每个物品都有无限多,第 \(i\) 个物品的体积为 \(v_i\)(\(v_i\le m\)). 问用这些物品恰好装满容量为 \(i ...
- Kafka入门经典教程【转】
问题导读 1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic.发送消息.消费消息?3.如何书写Kafka程序?4.数据传输的事务定义有哪三种?5.Kafka判断一个节点是否活着有 ...
- Linux配置Selenium+Chrome+Java实现自动化测试
1.安装chrome sudo apt-get install libxss1 libappindicator1 libindicator7 wget https://dl.google.com/li ...
- Demo004 迷宫的生成与遍历的代码审查
1.传送门 合作伙伴: 嚯唶 CnBlogs: 嚯唶 Coding:Rst321 代码: 迷宫的遍历与生成 2. 作业要求 (1). 首先在同学中找一个同伴,范围不限,可以在1~5班中随意组合,建议尽 ...
- js中parentNode,parentElement,childNodes,children
首先了解parentNode,parentElement,childNodes,children四大属性之前,必须对Dom树有一定的了解,在Dom文档结构中,HTML页面每一部分都是由节点组成的,节点 ...
- Git安装及密钥的生成
1.下载Git软件:http://msysgit.github.io/ 2.安装git软件(很简单).安装成功后,在[开始]->[程序]->[git],下就会看见Git Bash和Git ...
- 《剑指offer》写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
弱菜刷题还是刷中文题好了,没必要和英文过不去,现在的重点是基本代码能力的恢复. [题目] 剑指offer 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 直觉 ...