电商商城定制开发MySQL数据库基础知识11,查询缓存

目录

一、电商商城定制开发查询缓存是什么?

电商商城定制开发缓存保存查询返回的完整结果,电商商城定制开发当查询命中该缓存,MySQL电商商城定制开发会立刻返回结果,跳过解析、电商商城定制开发优化和执行过程。


电商商城定制开发查询缓存系统会跟踪查电商商城定制开发询中涉及的每个表,电商商城定制开发如果这些表发生变化,那么和这个表相关的所有的缓存数据都将失效,这种机制效率看起来比较低,因为数据表变化时可能对查询结果并没有影响,但是这种简单实现代价很小,而这点对于一个非常繁忙的系统来说非常重要。

二、MySQL如何判断缓存命中

判断是否命中时,MySQL不会解析,而是直接使用SQL语句和客户端发送过来的其它原始信息。任何字符上的不同,例如空格、注释,丢回导致缓存的不命中。通常使用统一的编码规则是一个好的习惯,会让你的系统运行的更快。

当查询语句中有一些不确定的数据时,不会被缓存,比如函数now()。实际上,如果缓存中包含任何用户自定义函数、存储函数、用户变量、、MySQL系统表、或者任何包含列级别权限的表,都不会被缓存。

三、使用查询缓存需谨慎

打开查询缓存对读和写操作都会带来额外的消耗:

  1. 读查询在执行之前要先检查是否命中缓存;
  2. 如果读查询可以被缓存,那么当完成执行后,MySQL如果发现缓存中没有这个查询,会将其结果存入查询缓存,这会带来额外的系统消耗;
  3. 对写操作也有影响,因为当向某个表写入数据的时候,MySQL必须将对应表的所有缓存设置失效。如果查询缓存非常大或者碎片很多,这个操作就可能会带来很大的系统消耗;

虽然如此,查询缓存仍然会给系统带来性能的提升。但是,上述的额外消耗也可能不断增加,再加上对查询缓存操作是一个加锁排它操作,这个消耗也不小。

对InnoDB用户来说,事务的一些特性会限制查询缓存的使用。当一个语句在事务中修改了某个表,在事务提交前,MySQL都会将这个表对应的查询缓存设置失效,因此,长时间运行的事务,会大大降低查询缓存的命中率。

四、如何分析和配置查询缓存

五、InnoDB和查询缓存

因为InnoDB有自己的MVCC机制,所以相比其它存储引擎,InnoDB和查询缓存的交互要更加复杂。

MVCC是多版本并发控制,是为了在读取数据时不加锁来提高读取效率和并发性的一种手段。MVCC解决的是读写时的线程安全问题,线程不用去争抢读写锁。

MVCC所提到的读是快照读,也就是普通的select语句,快照读在读写时不用加锁,不过可能会读到历史数据。

另一种读的方式是当前读,是一种悲观锁的操作,它会对当前读取的数据进行加锁,所以读到的数据都是最新的,主要包括以下操作:

  1. select lock in share mode,共享锁
  2. select for update,排它锁
  3. insert,排它锁
  4. update,排它锁
  5. delete,排它锁

InnoDB会控制在一个事务中是否可以使用查询缓存,InnoDB会同时控制对查询缓存的读写操作。事务是否可以访问查询缓存取决于当前事务的ID,以及对应的数据表上是否有锁。每一个InnoDB表的内存数据字典都保存了一个事务ID号,如果当前事务ID小于该事务ID,则无法访问查询缓存。

如果表上有任何的锁,那么对这个表的任何查询语句都是无法被缓存的。例如,某个事务执行了select for update语句,那么在这个锁释放之前,任何其它的事务都无法从查询缓存中读取与这个表相关的缓存结果。

当事务提交时,InnoDB持有锁,并使用当前的一个系统事务ID更新当前表的计数器。InnoDB将每个表的计数器设置成某个事务ID,而这个事务ID就代表了当前存在的且修改了该表的最大的事务ID。



MySQL进阶实战系列文章

哪吒精品系列文章


网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发