讲一讲MySQL如何防止“老鼠屎”类型的SQL语句
【原谅我标题党了】
当然不可能有哪一个SQL语句会这么出名,以至于大家叫它“老鼠屎”;但是有一些SQL语句确实主是做着这样的事;由于程序的
局部性原理,数据库会把常用的数据缓存到内存中,对于这种场景通常是使用LRU算法。
【原生的LRU算法有空子】
这里不是说LRU算法有BUG、只是说它在数据库这个场景下是有“问题”的,LRU算法本来是为了尽可能的把“热”数据保存在内存里。
数据表结构如果设计的不好的话就可能使得一些语句要走全表扫描,我们假设在“全表扫描”执行之前LRU中的数据是“热”的,由于
“全表扫描”会把大量的数据载入到内存,载入多少新的数据就会“淘汰”同等数量的“热”数据。真正的问题就在于因“全表扫描”而载入
到内存的数据可能再也不用了,也就是说因“全表扫描”而载入的数据大多数情况下是冷的;那么“全表扫描”语句就铸成了这样一个客户
的事实 ---- 全表扫描淘汰了大量的热数据,换来的只是载入了同等数量的冷数据。
【MySQL对LRU算法的改进】
MySQL对原生的LRU算法进行了改进、它把原生的LRU列表在逻辑上分成了两段,前面的5/8页面用来保存热数据,后面的3/8用来保存
“温”数据。 为什么说这3/8是“温”数据呢? 当有新的数据(页面)要载入内存时,这些数据会先被插入到“温”列表的顶部,如果这个时候
“温”列表的已经满了那么“温”列表底部数据(页面)就会被淘汰以容纳新的数据(页面)。也就是说“温”列表是一个正常的LRU列表,那数据
什么时候会被调入到“热”列表呢?而是从问题入手,因“全表扫描”而载入内存的语句通常只会被访问一次,而其它SQL载入的页面可能
要被多次的访问。解决方案就有了如果一个页面被调入“温”列表之后再也没有被访问那么它就不会被调入“热”列表,如果一个目前在“温”
列表中的时候又被访问了一次那么这个页面就会被调入“热”列表。DBA也可以手工设定“温”列表占整个列表的比较innodb_old_blocks_pct
参数就是做这个事的,默认值是37是一个非常直接3/8*100 (0.375*100)的值
就算MySQL对LRU算法做了这个优化,不过还是有一个小问题;比如说我现在的主机是512G的数据库400G给了buffer pool 一个400G
的buffer pool “温”列表也就有150G的大小;150G大小的列表如果一个页面从进入“温”列表顶部到它慢慢的被移到底部这个可能半个小时
过去了,如果这个时候它刚好被访问了一次,这下就不得了了,平地一声雷它要上天啦,它会被直接调到“热”列表的顶部!这个明显不是
DBA想要看到的结果。 MySQL针对这个也做了优化innodb_old_blocks_time这个参数用来控制时间维度,如果页面的第二次访问的时间
超过了innodb_old_blocks_time设定的值那么页面不会被调入“热”列表。
----
讲一讲MySQL如何防止“老鼠屎”类型的SQL语句的更多相关文章
- MySQL监控全部执行过的sql语句
MySQL监控全部执行过的sql语句 查看是否开启日志记录show variables like “general_log%” ; +——————+———-+|Variable_name|Value| ...
- 在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作
在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作 MyEclipse6.5 , mysq驱动jar包为mysql-connector ...
- Mysql中文乱码以及导出为sql语句和Excel问题解决
Mysql中文乱码以及导出为sql语句和Excel问题解决 这几天基于Heritrix写了一个爬虫,用到mysql,在导入导出数据时,遇到一些乱码问题,好不容易解决了,记录一下,以备查看.一.导出数据 ...
- 【原创】3. MYSQL++ Query类型与SQL语句执行过程(非template与SSQLS版本)
我们可以通过使用mysqlpp:: Query来进行SQL语句的增删改查. 首先来看一下mysqlpp::Query的一些最简单的调用, conn.connect(mysqlpp::examples: ...
- Mysql 定位执行效率低的sql 语句
一.通过MySQL慢查询日志定位执行效率低的SQL语句. MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysq ...
- mysql补充(2)常用sql语句
补充:MySQL数据库 详解 常用的Mysql数据库操作语句大全 1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后 ...
- MySQL学习【第五篇SQL语句上】
一.mysql命令 1.连接服务端命令 1.mysql -uroot -p123 -h127.0.0.1 2.mysql -uroot -p123 -S /tmp/mysql.sock 3.mysql ...
- 重新学习MySQL数据库12:从实践sql语句优化开始
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a724888/article/details/79394168 本文不堆叠网上海量的sql优化技巧或 ...
- 数据库、MySQL下载与安装、基本SQL语句
数据演变史 # 1.单独的文本文件 没有固定的存放位置 没有固定的数据格式 '''程序彼此无法兼容 没有统一的标准''' # 2.软件开发目录规范 按照文件功能的不同规定了相应的位置 '''文件查找变 ...
随机推荐
- 【AtCoder】AGC017
在此处输入标题 标签(空格分隔): 未分类 A - Biscuits dp[i][0/1]表示当前和是偶数还是奇数,直接转移即可 #include <bits/stdc++.h> #def ...
- TensorFlow 2.0 新特性
安装 TensorFlow 2.0 Alpha 本文仅仅介绍 Windows 的安装方式: pip install tensorflow==2.0.0-alpha0 # cpu 版本 pip inst ...
- CentOS 6.4在运行XFS时系统crash的bug分析
最近有一台CentOS 6.4的服务器发生多次crash,kernel version 是Linux 2.6.32-431.29.2.el6.x86_64.从vmcore-dmesg日志内容及cras ...
- 监听发现局域网dropbox客户端broadcast-dropbox-listener
监听发现局域网dropbox客户端broadcast-dropbox-listener Dropbox是一款网盘文件同步工具.为了实现局域网内同步,该工具会通过UDP 17500端口发送广播包.N ...
- Shiro笔记(二)身份验证
Shiro笔记(二)身份验证 一.核心代码 @Test public void helloWorldTest(){ IniSecurityManagerFactory factory = new In ...
- 滑动CheckBox样式
<Style x:Key="SliderCheckBox" TargetType="{x:Type CheckBox}"> <Setter P ...
- LED类代码
/* led.c文件 标题: 点亮一个了LED灯 电路:开发板中P2口已接到LED灯的阴极 */ #include <reg52.h> #include "led1.h&qu ...
- [HAOI2016]食物链
OJ题号:BZOJ4562.洛谷3183 思路:记忆化搜索. 本体可以转化成“求有向图中入度为0的结点到出度为0的结点的路径数”. 每次加边时记录每个结点的入度和出度,然后从入度为0的结点开始搜索,搜 ...
- c++对象工厂
一.简单工厂 #pragma once struct IObjectA { virtual void Test1()=0; }; class ObjectA:public IObjectA { p ...
- 设置Tab键缩进2字符
默认是1.74cm,是1.5字符. 论文是4个空格显示为4个点,或者全角下2个空格,显示为2个空格框.看上方的首航缩进标志是否在2. 看图 在段落 格式里面进行设置! 点上图的制表位 打开下图 选默认 ...