原谅我标题党了

  当然不可能有哪一个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语句的更多相关文章

  1. MySQL监控全部执行过的sql语句

    MySQL监控全部执行过的sql语句 查看是否开启日志记录show variables like “general_log%” ; +——————+———-+|Variable_name|Value| ...

  2. 在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作

    在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作 MyEclipse6.5    ,  mysq驱动jar包为mysql-connector ...

  3. Mysql中文乱码以及导出为sql语句和Excel问题解决

    Mysql中文乱码以及导出为sql语句和Excel问题解决 这几天基于Heritrix写了一个爬虫,用到mysql,在导入导出数据时,遇到一些乱码问题,好不容易解决了,记录一下,以备查看.一.导出数据 ...

  4. 【原创】3. MYSQL++ Query类型与SQL语句执行过程(非template与SSQLS版本)

    我们可以通过使用mysqlpp:: Query来进行SQL语句的增删改查. 首先来看一下mysqlpp::Query的一些最简单的调用, conn.connect(mysqlpp::examples: ...

  5. Mysql 定位执行效率低的sql 语句

    一.通过MySQL慢查询日志定位执行效率低的SQL语句. MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysq ...

  6. mysql补充(2)常用sql语句

    补充:MySQL数据库 详解 常用的Mysql数据库操作语句大全 1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后 ...

  7. MySQL学习【第五篇SQL语句上】

    一.mysql命令 1.连接服务端命令 1.mysql -uroot -p123 -h127.0.0.1 2.mysql -uroot -p123 -S /tmp/mysql.sock 3.mysql ...

  8. 重新学习MySQL数据库12:从实践sql语句优化开始

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a724888/article/details/79394168 本文不堆叠网上海量的sql优化技巧或 ...

  9. 数据库、MySQL下载与安装、基本SQL语句

    数据演变史 # 1.单独的文本文件 没有固定的存放位置 没有固定的数据格式 '''程序彼此无法兼容 没有统一的标准''' # 2.软件开发目录规范 按照文件功能的不同规定了相应的位置 '''文件查找变 ...

随机推荐

  1. java基础面试题-2

    第一,谈谈final, finally, finalize的区别.  final---修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被 ...

  2. ubuntu 18图形界面

    sh .start_mode.sh: 换操作方式(图形界面,终端界面): 桌面版: 界面中 ctrl + shift + t 打开终端 ctrl + shift + "+" 放大字 ...

  3. kms可用激活服务器地址|kms可用激活服务器分享

    kms可用激活服务器地址|kms可用激活服务器分享   kms可用激活服务器地址都有哪些呢?使用kms激活服务器激活windows和office是微软提供的激活方式之一.kms激活服务器普遍由个人或企 ...

  4. 针对SSL/TLS的拒绝服务攻击以及使用ettercap进行DNS欺骗

    一. thc-ssl-dos 1.简介 (1).SSL 协商加密对性能开销增加,大量握手请求会导致 DOS (2).利用 SSL secure Renegotiation 特性,在单一 TCP 连接中 ...

  5. Python3 Srcapy 爬虫

    最近一直在理论学习,没有时间写博客.今天来一波Python爬虫,为机器学习做数据准备. 爬虫配置环境 Anaconda3 + Spyder + Scrapy Anaconda 安装就不绍了,网上很多. ...

  6. SQL try

    BEGIN TRY -- Generate a constraint violation error. DELETE FROM Production.Product ; END TRY BEGIN C ...

  7. prufer序列计数的一些结论

    \(prufer\)序列和完全图的生成树一一对应(考虑构造) 完全图的生成树个数为\(n^{n - 2}\) 满足第\(i\)个点的度数为\(d_i\)的生成树为\(\frac{n!}{\prod ( ...

  8. Cocos Creator 的实现拖尾效果

    在游戏中,有时会需要在某个游戏对象上加上移动后的轨迹若隐若现的效果.使得游戏的效果较好,比如游戏大招,刀光,法术,流星划痕之类. Cocos Creator提供了一种内置的拖尾渐隐效果的实现方法:组件 ...

  9. oracle中查找和删除重复记录的几种方法总结

    平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录. 下面总结一下几种查找和删除重复记录的方法(以表CZ为例): 表CZ的结 ...

  10. react-native基础教程(1)

    转载链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/react-native-foundation-course/ React ...