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

白癜风一个疗程多少钱 https://m-mip.39.net/czk/mipso_4513569.html

一、缓存表和汇总表

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

缓存表用来存储那些获取很简单,但速度较慢的数据;

汇总表用来保存使用groupby语句聚合查询的数据;

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

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

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

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

二、视图与物化视图

1、视图

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

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

2、物化视图

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

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

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

三、加快altertable操作的速度

MySQL的altertable操作的性能对大表来说是个大问题。MySQL执行大部分修改表结构的操作的方法使用新的结构创建一个空表,从旧表中查出所有数据插入新表,然后删除旧表。

这样操作可能需要花费很长时间,如果内存不足而表又很大,而且还有很多索引的情况下更为严重。

改善的方法有两种:

第一种是先在一台不提供服务的机器上执行altertable操作,然后和提供服务的主表进行切换;

第二种方式是通过影子拷贝,影子拷贝的技巧是用要求的表结构创建一张和源表无关的新表,然后通过重命名和删表的操作交换两张表。

四、

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

createtablelike_count(numintunsignednotnull)engine=InnoDB;

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

updatelike_countsetnum=num+1;

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

createtablelike_count(

  slottinyintunsignednotnullprimarykey,

  numintunsignednotnull

)engine=InnoDB;

————————————————

版权声明:本文为CSDN博主「哪吒」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:


转载请注明:http://www.aierlanlan.com/tzrz/7197.html