当前位置:首页 > 技术 > 正文内容

MySQL进阶实战6,缓存表、视图、计数器表

Lotus2022-11-28 14:17技术

一、缓存表和汇总表

有时提升性能最好的方法是在同一张表中保存衍生的冗余数据,有时候还需要创建一张完全独立的汇总表或缓存表。

  • 缓存表用来存储那些获取很简单,但速度较慢的数据;
  • 汇总表用来保存使用group by语句聚合查询的数据;

对于缓存表,如果主表使用InnoDB,用MyISAM作为缓存表的引擎将会得到更小的索引占用空间,并且可以做全文检索。

在使用缓存表和汇总表时,必须决定是实时维护数据还是定期重建。哪个更好依赖于应用程序,但是定期重建并不只是节省资源,也可以保持表不会有很多碎片,以及有完全顺序组织的索引。

当重建汇总表和缓存表时,通常需要保证数据在操作时依然可用,这就需要通过使用影子表来实现,影子表指的是一张在真实表背后创建的表,当完成了建表操作后,可以通过一个原子的重命名操作切换影子表和原表。

为了提升读的速度,经常建一些额外索引,增加冗余列,甚至是创建缓存表和汇总表,这些方法会增加写的负担妈也需要额外的维护任务,但在设计高性能数据库时,这些都是常见的技巧,虽然写操作变慢了,但更显著地提高了读的性能。

二、视图与物化视图

1、视图

视图可以理解为一张表或多张表的与计算,它可以将所需要查询的结果封装成一张虚拟表,基于它创建时指定的查询语句返回的结果集。

查询者并不知道使用了哪些表、哪些字段,只是将预编译好的SQL执行,返回结果集。每次查询视图都需要执行查询语句。

2、物化视图

为了防止每次都查询,先将结果集存储起来,这种有真实数据的视图,称为物化视图。

MySQL并不原生支持物化视图,可以使用​​Justin Swanhart​​的开源工具​​Flexviews​​实现。

相对于传统的临时表和汇总表,​​Flexviews​​可以通过提取对源表的更改,增量地重新计算物化视图的内容。

三、加快alter table操作的速度

MySQL的alter table 操作的性能对大表来说是个大问题。MySQL执行大部分修改表结构的操作的方法使用新的结构创建一个空表,从旧表中查出所有数据插入新表,然后删除旧表。 这样操作可能需要花费很长时间,如果内存不足而表又很大,而且还有很多索引的情况下更为严重。

改善的方法有两种:

  • 第一种是先在一台不提供服务的机器上执行alter table操作,然后和提供服务的主表进行切换;
  • 第二种方式是通过影子拷贝,影子拷贝的技巧是用要求的表结构创建一张和源表无关的新表,然后通过重命名和删表的操作交换两张表。

四、计数器表

通常创建一张表来存储用户的点赞数、网站访问数等。

​create table like_count(num int unsigned not null) engine=InnoDB;​

每次点赞都会导致计数器进行更新:

​update like_count set num = num + 1;​

问题在于,对于任何想要更新这一行的事务来说,这条记录上都有一个全局的互斥锁​​mutex​​。这会使这些事务都只能串行执行,要获得更高的并发更新性能,可以将计数器保存在多行中,每次随机选择一行进行更新。

create table like_count(
slot tinyint unsigned not null primary key,
num int unsigned not null
) engine=InnoDB;

预先在这张表中新增10条数据,然后选择一个随机的槽slot进行更新:

注意:为了研究之后遇到的问题,后来又插入了一条~

MySQL进阶实战6,缓存表、视图、计数器表_数据

update like_count set num = num + 1 where slot = floor(rand() * 10);

更新了两行,这是为什么呢?

MySQL进阶实战6,缓存表、视图、计数器表_缓存_02

MySQL进阶实战6,缓存表、视图、计数器表_数据_03

​select一下,查询结果,有的时候0条,有的时候1条,有的时候2条,有的时候3条​​,惊呆了,这么有趣的事情,我怎么能放过,让我们一起一探究竟。

MySQL进阶实战6,缓存表、视图、计数器表_数据_04

MySQL进阶实战6,缓存表、视图、计数器表_缓存_05

MySQL进阶实战6,缓存表、视图、计数器表_缓存_06

让我们一起一探究竟:

  • floor() 函数的作用:返回小于等于该值的最大整数;
  • rand()函数的作用:获得0到1之间的随机值;

在ORDER BY或GROUP BY子句中使用带有RAND()值的列可能会产生意想不到的结果,因为对于这两个子句,RAND()表达式都可以对同一行计算多次,每次返回不同的结果。要从一组行中随机选择一个样本,将ORDER BY RAND()和LIMIT配合使用。

在MySQL的官方手册里,针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。

这就完了?

原文链接

扫描二维码推送至手机访问。

版权声明:本文来源于网络,仅供学习,如侵权请联系站长删除。

本文链接:https://news.layui.org.cn/post/1047.html

分享给朋友:

“MySQL进阶实战6,缓存表、视图、计数器表” 的相关文章

JS奇淫技巧:数值的七种写法

JS奇淫技巧:数值的七种写法 JS奇淫技巧:挑战前端黑科技,数值的七种写法,能全看懂的一定是高手 你知道吗?在JS编程中,数值可以有很多种写法。 第一种写法: 一般情况而言,数值就是数值。 比如: var a = 1; 你可知,这个1可以有很多种变形的写法,甚至是变态的写法。 第二种写法: var a= +!!{}; console.log(a); 即:1变成了+!!{}。 数值1为什么能...

#打卡不停更#[图文并茂]Packstack部署train版openstack

Packstack部署openstack-train 介绍如何在centos7.9中使用packstack部署openstack-train。 首先需要安装一个最小化安装的centos7.9,按照你的网络环境配置好网络,然后重启。 这里我的环境是VMware虚拟机,ip是192.168.10.30. 首先我们需要关闭防火墙和NetworkManager systemctl disable --n...

激活数据价值,探究DataOps下的数据架构及其实践丨DTVision开发治理篇

据中国信通院发布,2012 年到 2021 年 10 年间,我国数字经济规模由 12 万亿元增长到 45.5 万亿元,在整个 GDP 中的比重由 21.6% 提升至 39.8%。顺应时代发展新趋势,“数据” 成为新的生产要素已是毋庸置疑的共识。 如果说数据中台的崛起代表着企业数字化转型从流程驱动走向数据驱动,从数字化走向智能化。那么 DataOps,则是实现数据中台的一个优秀的理念或方法论。 D...

css:利用伪类处理图片加载失败的样式问题

实现效果 实现代码 index.html <h2>未做错误处理</h2> <div style="font-size: 0"> <img src="./img/image.jpg" alt="" /> <img src="./img/image-1.jpg" alt="" /> &l...

【微信小程序】小程序的宿主环境

????系列专栏:微信小程序 ????欢迎关注????点赞????收藏⭐留言???? ✅个人主页:​​hacker_demo的51CTO博客​​ ????个人格言:不断的翻越一座又一座的高山,那样的人生才是我想要的。这一马平川,一眼见底的活,我不想要,我的人生,我自己书写,余生很长,请多关照,我的人生,敬请期待???????????? 宿主环境简介 宿主环境(host environ...

C++浅拷贝深拷贝

1. C++ 浅拷贝 什么是浅拷贝? 一般比较形象的理解,浅拷贝可以理解"值"层面的拷贝,深拷贝可以理解成"内存"上的拷贝,特别是类里面含有指针类型的。 // .h文件class HasPtrMem{public:HasPtrMem();HasPtrMem(const HasPtrMem& h);~HasPtrMem();void print();int *p;};// .cpp 文件H...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。