返回顶部
首页 > 资讯 > 数据库 >怎么用mysql实现一个小魔术
  • 950
分享到

怎么用mysql实现一个小魔术

2024-04-02 19:04:59 950人浏览 独家记忆
摘要

本篇内容介绍了“怎么用Mysql实现一个小魔术”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!测试过程如下:

本篇内容介绍了“怎么用Mysql实现一个小魔术”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

测试过程如下:
mysql> select * from test;
+------+
| name |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
5 rows in set (0.00 sec)

mysql> select * from test;
+------+
| name |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
5 rows in set (0.00 sec)

mysql> flush tables;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;
+------------------------------+
| name |
+------------------------------+
| 热烈祝贺宇宙大爆炸一万万周年 |
| 忽忽变了变了 |
+------------------------------+
2 rows in set (0.00 sec)

mysql>

测试中使用的表是MyIsam引擎。
只是执行flush table并没有update,delete,insert的操作说明这个现象也就是跟缓存之类的有关。
先看看flush table是做了什么。
mysql参考手册中解释:
关闭打开的表,并迫使所有正在使用的表关闭。这也会刷新查询缓存。和RESET QUERY CACHE语句一样,FLUSH TABLES还会取消来自查询缓存的所有查询结果。
呵呵 下面来分析一下这个“魔术”是怎么产生的。
首先我们会想到query cache,其实这很容易理解。
本次测试中query cache参数如下:
mysql> show variables like 'q%';
+------------------------------+----------+
| Variable_name | Value |
+------------------------------+----------+
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 34603008 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
+------------------------------+----------+
7 rows in set (0.00 sec)
mysql中的query cache的功能是缓存查询结果,在下次查询是如果查询语句相同会直接从缓存中提取结果,而不是从数据表中查询。
当然并非是所有的查询都会被缓存,要满足一定条件:结果集超过query_cache_limit的大小不缓存,procedure中的结果不缓存,子查询中的外联结果集不缓存。。
本次测试不存在这些问题。
所有过程如下:
先插入数据:
mysql> insert into test values("热烈祝贺宇宙大爆炸一万万周年");
Query OK, 1 row affected (0.00 sec)

mysql> insert into test values("忽忽变了变了");
Query OK, 1 row affected (0.00 sec)
然后把数据文件copy到其他位置
root@qadb:/var/lib/mysql/test# cp -a test.* /root/test
删除表中的数据
mysql> delete from test;
Query OK, 3 rows affected (0.00 sec)
插入新数据
mysql> insert into fuleqing values('1');
Query OK, 1 row affected (0.00 sec)

mysql> insert into fuleqing values('2');
Query OK, 1 row affected (0.00 sec)

mysql> insert into fuleqing values('3');
Query OK, 1 row affected (0.00 sec)

mysql> insert into fuleqing values('4');
Query OK, 1 row affected (0.00 sec)

mysql> insert into fuleqing values('5');
Query OK, 1 row affected (0.00 sec)

最后把之前备份的数据文件覆盖现在的数据文件
root@qadb:/var/lib/mysql/test# cp -a /root/test.* .

现在在之客户端执行select ,flush,select这个”魔术“就可以了

到这里大家应该都看明白了吧,如果我们使用DDL语句更改数据则相关的query cache则会相应的失效,再次使用会从数据表中读取。但如果使用直接数据文件覆盖的话至少目前mysql的MyIsam引擎并不知道数据发生了变化,相应的query cache并不会失效。第一次select的结果其实是从cache里取的旧数据,直到flush后query cache被清空,然后再select才是从新的数据文件读取。

下面我再做一个小”魔术“,不使用query cache
mysql> select sql_no_cache * from test;
+------+
| name |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
5 rows in set (0.00 sec)

mysql> select sql_no_cache * from test;
+------+
| name |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
5 rows in set (0.00 sec)

mysql> flush tables;
Query OK, 0 rows affected (0.00 sec)

mysql> select sql_no_cache * from test;
+------------------------------+
| name |
+------------------------------+
| 热烈祝贺宇宙大爆炸一万万周年 |
| 忽忽变了变了 |
+------------------------------+
2 rows in set (0.00 sec)

mysql>

一般到这里大家会产生点疑问,都不从cache里取数据了为什么也会出现这个现象呢?

如果我们还是按照之前的操作,用备份的数据文件覆盖是不行的。
大家可以看到有两种情况,如果备份的数据比当前的数据多,只显示新数据文件中的部分数据。如果备份的数据比当前的数据少,查询即报错。
mysql> select sql_no_cache * from test;
ERROR 1194 (HY000): Table 'test' is marked as crashed and should be repaired
这些跟mysql的故障侦测机制有关,我没有深入的研究。等以后有时间再看
在出现上面这些情况时做一下flush table或者repair一下都可以恢复正常,但是重现不了我们这次的”魔术“
说一下我操作的过程:
插入数据->备份表的数据文件

delete旧数据
insert新数据
这个过程跟前一个场景相同.之后就不一样了
删除当前数据文件
root@qadb:/var/lib/mysql/test# rm test.*
copy回备份数据文件
root@qadb:/var/lib/mysql/test# cp -a /root/temp/test.* .
现在前面的客户端又可以执行select,flush,select这个"魔术"了

这次又是为什么呢?
首先声明这次的测试只有在linux/unix中才能实现,windows不可以
我们知道mysql是通过os来操作数据文件的,这就要跟linux/unix对文件的处理有关.
一个比较经典的问题,在windows中当一个文件被使用的时候,另一个进程可以删除这个文件吗?这个我们都知道不行。
但在linux/unix中呢?是可以的。之前读取文件的进程在文件被另一个进程删除后会报错吗?也不会。

这个文件这时候其实并没有真正意义上删除。在linux/unix中只有所有操作该文件的进程/线程都退出,该文件才会真正的被释放。
分析本次的select,flush,select的操作如下:
虽然另一个进程删除了数据文件并copy进新的数据文件但由于之前表是open的,mysql后台线程一直在使用旧数据文件,该文件并未真正删除。此时select的数据仍是旧数据。
flush 关闭表,使用旧数据文件的线程退出,旧数据文件被真实释放;
再次select 表open这时读取新的数据文件。此时select的数据为新数据。

“怎么用mysql实现一个小魔术”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: 怎么用mysql实现一个小魔术

本文链接: https://lsjlt.com/news/69411.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么用mysql实现一个小魔术
    本篇内容介绍了“怎么用mysql实现一个小魔术”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!测试过程如下:...
    99+
    2024-04-02
  • 使用css3怎么实现一个魔方3d效果
    使用css3怎么实现一个魔方3d效果 ?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。css是什么意思css是一种用来表现HTML或XML等文件样式的计算机语言,...
    99+
    2023-06-08
  • 怎么在ython中利用dict实现一个魔法方法
    怎么在ython中利用dict实现一个魔法方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。python可以做什么Python是一种编程语言,内置了许多有效的工具,Pyth...
    99+
    2023-06-14
  • 怎么用Python脚本实现魔塔小游戏
    这篇文章主要介绍“怎么用Python脚本实现魔塔小游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用Python脚本实现魔塔小游戏”文章能帮助大家解决问题。开发工具Python版本: ...
    99+
    2023-06-29
  • 怎么使用PHP常用的八个魔术常量
    这篇文章主要介绍“怎么使用PHP常用的八个魔术常量”,在日常操作中,相信很多人在怎么使用PHP常用的八个魔术常量问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用PHP常用的八个魔术常量”的疑惑有所帮助!...
    99+
    2023-06-25
  • 怎么用Javascript实现一个转盘小游戏
    本篇内容主要讲解“怎么用Javascript实现一个转盘小游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Javascript实现一个转盘小游戏”吧!前...
    99+
    2024-04-02
  • 使用css3怎么实现一个宠物小鸡
    今天就跟大家聊聊有关使用css3怎么实现一个宠物小鸡,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。<body>    <di...
    99+
    2023-06-08
  • c++中怎么实现一个mysql通用类
    本篇文章给大家分享的是有关c++中怎么实现一个mysql通用类,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。常用的函数初始化API库:mysq...
    99+
    2024-04-02
  • JavaScript实现一个前端会魔法的旋转魔方相册
    目录效果图1. HTML篇2. CSS篇2.1 基础设置2.2 魔方样式2.3 图片折叠2.4 图片按钮样式2.5 设置配合JS使用的翻转样式3. JS篇4. 完整代码4.1 htm...
    99+
    2024-04-02
  • node中怎么实现一个http小爬虫
    这篇文章给大家介绍node中怎么实现一个http小爬虫,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。爬取Node.js 教程首页的所有数据建立node-http.js,其中代码如下,代...
    99+
    2024-04-02
  • PHP的魔术方法怎么用
    本篇内容介绍了“PHP的魔术方法怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在PHP中,以双下划线(__)开始命名的方法被称作PHP...
    99+
    2023-06-30
  • 使用Java怎么实现一个贪吃蛇小游戏
    这篇文章将为大家详细讲解有关使用Java怎么实现一个贪吃蛇小游戏,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 程序结构  程序结构图如图:2. 程序设计思路2.1 Data类作用:连接st...
    99+
    2023-06-14
  • 使用Python怎么模拟一个n阶魔方
    今天就跟大家聊聊有关使用Python怎么模拟一个n阶魔方,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。import cv2import numpy as...
    99+
    2023-06-14
  • Javascript中怎么实现一个小型区块链
    本篇文章为大家展示了Javascript中怎么实现一个小型区块链,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。区块链概念狭义:区块链是一种按照时间顺序将数据区块以顺...
    99+
    2024-04-02
  • Python中怎么实现一个猜数小游戏
    Python中怎么实现一个猜数小游戏,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。实现效果: 程序截图:点击(此处)折叠或打开from random i...
    99+
    2023-06-04
  • vue实战中的一些实用小魔法汇总
    能让你首次加载更快的路由懒加载,怎么能忘? 路由懒加载可以让我们的包不需要一次把所有的页面的加载进来,只加载当前页面的路由组件就行。 举个🌰,如果这样写,加载的时候会...
    99+
    2024-04-02
  • 使用java怎么实现一个mysql分表操作
    使用java怎么实现一个mysql分表操作?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。设置项目气动执行次方法(每天检查一次表记录)public cl...
    99+
    2023-06-06
  • 使用C语言怎么实现一个猜拳小游戏
    本篇文章给大家分享的是有关使用C语言怎么实现一个猜拳小游戏,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体内容如下#include<stdio.h>#includ...
    99+
    2023-06-06
  • 使用C/C++怎么实现一个推箱子小游戏
    这篇文章给大家介绍使用C/C++怎么实现一个推箱子小游戏,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。如何实现首先思考要保存箱子,小猪等信息,添加多个map可以用到三维数组。2.定义小猪,箱子,墙,空地等信息在三维数组...
    99+
    2023-06-15
  • 怎么使用vue3实现一个人喵交流小程序
    本篇内容主要讲解“怎么使用vue3实现一个人喵交流小程序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用vue3实现一个人喵交流小程序”吧!前言相信很多养猫的人都很想跟自己的猫进行沟通,当...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作