讲一讲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.软件开发目录规范 按照文件功能的不同规定了相应的位置 '''文件查找变 ...
随机推荐
- Python os.path.basename
一.获取对应路径下文件的名字 >>> os.path.basename("/etc/sysconfig/selinux") 'selinux' >>& ...
- Ubuntu/Linux网络配置常用命令
配置ip 打开配置文件 sudo vim /etc/network/interfaces # This file describes the network interfaces available ...
- SparseArray源码解析
转载自SparseArray源码解析 No1: Android官方推荐:当使用HashMap(K, V),如果K为整数类型时,使用SparseArray的效率更高. No2: HashMap是使用数组 ...
- HDU 2602 Bone Collector 骨头收集者【01背包】
题目链接:https://vjudge.net/contest/103424#problem/A 题目大意: 第一行输入几组数据,第二行第一个数字代表物体个数,第二个数代表总体积.需要注意的是,第三排 ...
- 008.Docker Flannel+Etcd分布式网络部署
一 环境准备 1.1 Flannel概述 Flannel是一种基于overlay网络的跨主机容器网络解决方案,即将TCP数据包封装在另一种网络包里面进行路由转发和通信,Flannel是CoreOS开发 ...
- unity与安卓通讯的一些事儿
1.unity与安卓通讯的两种方法: 第一种是unity导出安卓工程,在unity的BuildSetting窗口可以将unity工程导出为安卓工程,然后再用Eclipse或者Android Studi ...
- STL中实现 iterator trail 的编程技巧
STL中实现 iterator trail 的编程技巧 <泛型编程和 STL>笔记及思考. 这篇文章主要记录在 STL 中迭代器设计过程中出现的编程技巧,围绕的 STL 主题为 (迭代器特 ...
- loj#2071. 「JSOI2016」最佳团体
题目链接 loj#2071. 「JSOI2016」最佳团体 题解 树形dp强行01分规 代码 #include<cstdio> #include<cstring> #inclu ...
- loj#2129. 「NOI2015」程序自动分析
题目链接 loj#2129. 「NOI2015」程序自动分析 题解 额... 考你会不会离散化优化常数 代码 #include<queue> #include<cstdio> ...
- BZOJ.3920.Yuuna的礼物(莫队 分块套分块 分段离散化)
题目链接 详细题解:https://www.cnblogs.com/autsky-jadek/p/4376091.html 代码参考自:https://www.cnblogs.com/Sakits/p ...