• Mysql8.0为什么取消了缓存查询的功能


    首先我们介绍一下MySQL的缓存机制

    【MySQL缓存机制】简单的说就是缓存sql文本及查询结果,如果运行完全相同的SQL,服务器直接从缓存中取到结果,而不需要再去解析和执行SQL。

    但如果表中任何数据或是结构发生改变,包括INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,最简单的就是我们在SQL语句中多了空格啥的,注释,或者是大小写,那么hashmap中的key和value对应都是不一样的,那么使用这个表的所有缓存查询将不再有效。。

    缓存是对系统性能优化的重要手段。。。

    主要是因为

    1.MySQL缓存是基于Hashmap的:查询语句的字符大小写、空格或者注释的不同,缓存查询都会认为是不同的查询(因为他们的hash值会不同)

    2.MySQL会对每条接收到的SELECT类型的查询进行hash计算,然后查找这个查询的缓存结果是否存在。虽然hash计算和查找的效率已经足够高了,一条查询语句所带来的开销可以忽略,但一旦涉及到高并发,有成千上万条查询语句时,hash计算和查找所带来的开销就必须重视了。。。

    3.也就是修改某个表的内容时,之前缓存的内容对于现在的数据来说就是错误的数据,所以我们要将之前的缓存数据删除,来保证数据的正确性。当向某个表写入数据的时候,必须将和这个表相关的所有缓存设置为失效,如果缓存内容很多,则消耗也会很大,可能使系统僵死,因为这个操作是靠全局锁操作来保护的。。

    总结

    所以综合上述的内容,我们知道原因就是如果数据都要缓存起来,一旦这些数据都发生改变时,需要更改,我们又需要把这些缓存删除,数据量大时,就会很慢,效率低。

    解决思路是:把一些容易变动的数据还是存在磁盘上,而不是在缓存中,这样就是省去了缓存改来改去的问题。。

    解决方案:运用了新的数据库Redis 

    介绍一下redis ----Redis是当前比较热门的NoSQL系统之一---,Redis数据都是缓存在计算机内存中。。用redis去存储热点数据,也是那些在数据库中大量的人去访问的数据。。

    NoSQL,泛指非关系型的数据库区别于关系数据库,它们不保证关系数据的ACID特性。。。。

     

    这里我们又要引入事务的概念,如下:

    事务定义

    事务是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,即要么所有操作都做,要么所有操作都不做,这就是事务。

           理解一:

           事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败。

           理解二:

           事务可以看做是一个大的操作,它由一系列操作组成,这些操作要么全部成功,要么全部失败。

     

    ACID---事务的四大特性 ---原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

    A:事务是一个不可分割的整体,事务中的操作要么全部成功,要么全部失败。。

    复制代码
    举一个SQL事务的例子:
    begin
    transaction; update account set money = money-100 where name = '张三'; update account set money = money+100 where name = '李四'; commit transaction;
    这里面的两个操作必须都成功或者都失败。。。。。
    复制代码

     

    B:我们来看一段狗屁话:事务必须使数据库从一个一致性状态变换到另外一个一致性状态,能理解?????

    个人认为就是执行这操作能够达到你的目的,然后不出错,在编写中体现在语法和实现是否可行,在功能上就是可以保证最后的结果和你的想法是一致的。。。

     

    I:隔离性体现在:多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

     

    D:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

    也就是说,给你造成了影响,你一旦告诉我你操作成功了,是不可以不执行的。。。。

     

     

    复制代码
    本地事务的实现:
    
    begin transaction;
    
      //1.本地数据库操作:张三减少100元。
    
      //2.本地数据库操作:李四增加100元。
    
    commit transaction;
    
    
    分布式事务的实现:
    
    begin transaction;
    
      //1.本地数据库操作:张三减少100元。
    
      //2.远程调用:让李四增加100元。
    
    commit transaction; 
    复制代码

     

  • 相关阅读:
    2023软件测试面试避坑指南
    Linux进程概念和控制(必备知识)
    提高生产力!这10个Lambda表达式必须掌握,开发效率嘎嘎上升!
    Win11升级包下载后如何删除
    用Django 写学习笔记程序第二章.2创建用户账户
    分布式精华笔记!带你深入剖析一致性共识算法还不来看?
    CSS3 就可以写出一个苹果官方渐变颜色文字效果,真的太逼真了!
    Prometheus采集Java程序指标信息
    简单工厂、工厂方法、抽象工厂对比
    ClickHouse 创建数据库建表视图字典 SQL
  • 原文地址:https://www.cnblogs.com/FJCLJ/p/17337342.html