目录 1.   InnoDB表的索引的几个概念 2.   覆盖索引和回表 3.   分页查询 4.   延迟关联优化 写在前面 下面的介绍均是在选用MySQL数据库和Innodb引擎的基础开展.我们先来学习索引的几个概念,帮助我们理解延迟关联优化的加快分页查询速度的原因. 一.Innodb表的索引的几个概念 InnoDB表是基于聚簇索引建立的. 索引一般分为主键索引和普通索引(辅助索引),聚簇索引并不是主键索引这样的单独的索引类型,而是一种数据存储方式.通俗的来说,单独的索引是存储了索引信息的B…
所有的php初学者都应该知道,mysql的分页语句写法如下: 1 select * from a limit (page-1)*page_size,page_size 而当这语句分页到一定程度时,例如1000页,每页20条 1 select * from a limit 19980,20 会发现分页之后查询的会越来越慢 原因是因为limit a,b 的取数据方式是,先取出a+b条数据,再把a条筛选掉,剩b条,相当于一次性要取a+b条的数据,而a条其实是无用的 解决方案如下 一:php代码解决 例…
[提出问题] 从数据表t通过分页查询的方式读取数据,读取时要根据a1排序.t有80万行记录,当OFFSET很大时,读取速度很慢.优化后查询速度提升很快. 下图是表的定义,一共有几十个字段,RowLength大概500字节.除了主键,没有其他索引. CREATE TABLE `t` ( `a0` ) NOT NULL, `a1` ) NOT NULL, `a2` ,) NOT NULL DEFAULT '0.000000000', `a3` ,) NOT NULL DEFAULT '0.00000…
理想的索引,高效的索引建立考虑: :查询频繁度(哪几个字段经常查询就加上索引) :区分度要高 :索引长度要小 : 索引尽量能覆盖常用查询字段(如果把所有的列都加上索引,那么索引就会变得很大) : 索引长度直接影响索引文件的大小,影响增删改的速度,并间接影响查询速度(占用内存多). 针对列中的值,从左往右截取部分,来建索引 : 截的越短, 重复度越高,区分度越小, 索引效果越不好 : 截的越长, 重复度越低,区分度越高, 索引效果越好,但带来的影响也越大--增删改变慢,并间影响查询速度. 所以,…
对于web后台报表导出是一种常见的功能点,实际对应服务后端即数据库的排序分页查询.如下示例为公司商户积分报表导出其中一个sql ,当大批量的导出请求进入时候,mysql的cpu急剧上升瞬间有拖垮库的风险. SELECT * FROM coupons.cp_score_log WHERE `m_shopid` ORDER BY add_time DESC LIMIT , ; 报表导出功能存在几个问题: 1.时间跨度太大,数据量剧增.(可以结合业务需求,限制一定时间范围,比如只能导出3个月以内数据)…
其实在我们的工作中类似,select * from your_table order by id desc limit 2000000,20会经常遇见,比如在分页中就很常见. 如果我们的sql中出现这样的查询(比如:点击查看“末页”),那是相当恐怖的(等待时间会很长).该sql是一个非常典型的排序+分页查询:order by col limit N,OFFSET M, MySQL 执行此类sql时需要先扫描到N行,然后再去取 M行.对于此类大数据量的排序操作,取前面少数几行数据会很快,但是越靠后…
有时在处理偏移量非常大的分页时候查询时,例如LIMIT 1000,10这样的查询,这时MySQL需要查询1010条记录然后只返回最后10条,前面1000条记录都被抛弃,这样的代价非常高.要优化这种查询,要么在页面中限制分页的数量,要么是优化大偏移量的性能. 优化此类分页查询的一个最简单的办法就是尽可能地使用索引覆盖查询,而不是查询所有的列.然后根据需要做一个关联操作再返回所需的列.如下 SELECT id, name, source, desc FROM alert ORDER BY name…
一.前言 MySQL分页查询作为Java面试的一道高频面试题,这里有必要实践一下,毕竟实践出真知. 很多同学在做测试时苦于没有海量数据,官方其实是有一套测试库的. 二.模拟数据 这里模拟数据分2种情况导入,如果只是需要数据测试下,那么推荐官方数据.如果官方数据满足不了需求的话,那么我们自己模拟数据. 1. 导入官方测试库 下载 官方数据库文件 或者在 github 上下载. 该测试库含有6个表. 首先进入 employees_db, 执行导入数据指令 mysql -uroot -proot -t…
MySQL limit分页查询的性能优化 Mysql的分页查询十分简单,但是当数据量大的时候一般的分页就吃不消了. 传统分页查询:SELECT c1,c2,cn… FROM table LIMIT n,m MySQL的limit工作原理就是先读取前面n条记录,然后抛弃前n条,读后面m条想要的,所以n越大,偏移量越大,性能就越差. 推荐分页查询方法: 1.尽量给出查询的大致范围 SELECT c1,c2,cn... FROM table WHERE id>=20000 LIMIT 10; 2.子查…
limit分页原理 当我们翻到最后几页时,查询的sql通常是:select * from table where column=xxx order by xxx limit 1000000,20.查询非常慢.但是我们查看前几页的时候,速度并不慢.这是因为limit的偏移量太大导致的.MySql使用limit时的原理是(用上面的例子举例): MySql将查询出1000020条记录. 然后舍掉前面的1000000条记录. 返回剩下的20条记录. 上述的过程是在<高性能MySql>书中确认的. 两个…