MySQL实战:快速优化大分页查询

2023-05-31 0 347

MySQL实战:快速优化大分页查询

MySQL是两个成形的开放源码资料库信息系统,应用领域广为。在前述合作开发中,他们会碰到大巨集查阅的应用领域情景。在处置大巨集查阅时,很难再次出现操控性困局和阻抗极重的难题。所以怎样强化大巨集查阅呢?责任编辑从多种不同视角和两栖作战事例导出大巨集查阅的强化思路。

碰到的难题

以两个前述合作开发中的事例为例,一场须要查阅100W+的历史记录,依照整本500条的巨集形式展开查阅。查阅结论明确要求依照天数爱勤次序,前提过滤器是必快捷键。起初的标识符同时实现形式如下表所示:

SELECT *FROM tablenameWHERE conditionORDER BY time DESCLIMIT (pageNum-1)*pageSize, pageSize

起初的同时实现方

是不是强化

为的是化解以内难题,在课堂教学操作过程中,他们归纳了下列强化思路:

1加进检索

检索是强化大巨集查阅的关键思路。在 WHERE 前提、ORDER BY 次序和 LIMIT 巨集等查阅操作方式中,都能提高查阅操控性。

WHERE 前提:

在查阅前提中添加检索,能大幅提高查阅的工作效率。但,加进检索也须要慎重,过多的检索会负面影响资料库的写操控性。

ORDER BY 次序:

一般来说情况下次序是透过次序演算法同时实现,假如结论集非常大,次序演算法大自然会耗用大批的缓存,因而时间维数也会随著信息量的减少而减少。因而,对次序表头加进检索,能防止统计数据被数次扫描器。

LIMIT 巨集:

这也是大巨集查阅操作过程中的两个核心操作方式,使用巨集时,必须加进巨集所对应的检索,否则查阅语句并不能真正的达到巨集目的。同时,强化该检索的形式也很关键,一般透过覆盖检索和适当调整检索顺序来强化查阅工作效率。

2缓存统计数据

缓存统计数据是提高大巨集查阅操控性的两个有效思路。在大巨集查阅情景中,一般来说信息量相对较大,加快页面访问速度须要缓存部分统计数据。同时,缓存不仅可以显著提高查阅速度,还可以降低服务器阻抗,加快响应速度。

MySQL 官方没有为每两个版本提供相应的缓存机制,但他们一般来说使用 redis 或 memcached 等开放源码缓存方案,对统计数据展开缓存处置。值得注意的是,缓存的统计数据应该定义合理的过期天数,防止缓存占用过多缓存导致服务器崩溃。

3拆分查阅

对于超大的统计数据集合,拆分查阅可以将查阅结论切分成多个小结论,并最终依照行的形式合并集中式结论。一般来说将统计数据拆分成多个小统计数据块,并历史记录每个块的范围信息。每个资料库查阅仅返回所需的小块结论,最后再展开合并。

拆分查阅可以显著缩短整个查阅操作方式的耗时,同时,在处置巨集查阅时可以减小了查阅文旦的检索大小,也能减少查阅锁。这种形式的适用范围比较广,适用于须要向前或向后展开巨集查阅的情景。

4 SQL 强化

对 SQL 展开进一步强化也能有效提高查阅工作效率。主要有下列思路:

减少不必要的查阅表头

在前述合作开发中,很多情况下只须要部分表头信息,但查阅语句是 SELECT *,这样查阅出来的结论中包含了很多不必要的信息。减少查阅表头数量能大幅减少资料库的 I/O 操作方式,提高查阅工作效率。

根据表结构合理使用统计数据类型

在选择统计数据类型时要根据具体情况合理选择。一般来说,查阅工作效率与表中表头的统计数据类型有非常大关系。比如,使用 int 类型而不是 varchar 存储数字,使用 char(2)而不是 varchar(2)等等。

防止使用子查阅

在 SQL 中,子查阅相对较慢。而且子查阅还会用到临时表,因而须要占用更多的缓存。他们可以使用 LEFT JOIN、JOIN、IN、EXIST 等方法来代替子查阅。

使用分区表

分区表是 MySQL 提供的一种分表机制。透过分区表,能将统计数据分散存储在多个物理分区上,提高查阅和维护的工作效率。使用分区表的前提是必须先创建两个分区表,因而检索也须要在每个分区上分开使用。

强化两栖作战

在上述强化思路的基础上,下列两栖作战事例能帮助他们深入理解大巨集查阅的强化方法:

巨集强化:

–创建检索ALTER TABLE tablename ADD INDEX indexname (id);–强化查阅语句SELECT *FROM tablenameWHERE id >=( SELECT id FROM tablename WHERE condition AND id < lastid ORDER BY id DESC LIMIT 0,1 )ORDER BY id ASC LIMIT pageSize;

ORDER BY 操作方式,查阅工作效率提高非常大。

缓存强化:

采用 redis 缓存来强化巨集查阅:

//当页码未超出总页数时,从缓存中读入统计数据if (!$isLastPage &&$this->listCache->exists($cacheKey)){ $ret =$this->listCache->get($cacheKey);} else {//字符串缓存20000秒$ttl =20000;//开始取得依据查阅前提的总历史记录数$totalCount =$this->getTotalRecordCount($params);//计算出dataCount $totalCount >0 &&$dataCount =($totalCount >$pageSize)? $pageSize :$totalCount;//计算出依据 LIMIT 语句查找统计数据所在的起点$start =($pageNo -1)* $pageSize;//构造SQL语句:注意LIMIT语句中的两个问号”?”是绑定位置,须要透过bindValue形式赋值$sql =”SELECT * FROM tableName WHERE field1=:field1 AND field2=:field2 ORDER BY id DESC LIMIT :start,:limit”;//执行 SQL 查阅$sth =$pdo->prepare($sql);$sth->bindValue(:field1,$params[field1]);$sth->bindValue(:field2,$params[field2]);$sth->bindValue(:limit, intval($dataCount), PDO::PARAMINT);$sth->bindValue(:start, intval($start), PDO::PARAMINT);$sth->execute();//查阅结论同步到缓存中 if($totalCount>0){ $this->listCache->setex($cacheKey,$ttl, serialize($sth->fetchAll()));} $ret =$sth->fetchAll();}

透过巨集查阅做缓存,能显著提高查阅工作效率,并减少资料库阻抗。

归纳

针对大巨集查阅,MySQL 在许多方面展开了强化,而他们在前述合作开发中可以针对不同前述情况展开具体强化方案的选择,以同时实现高效查阅和批量处置。在前述合作开发中,强化方法不可同日而语,须要视不同的应用领域情景定制化具体的强化方案。

(原创不易,假如喜欢请随手

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务