21

MySQL 数据库性能优化之缓存参数优化

数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作。而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级。所以,要优化数据库,首先第一步需要优化的就是 IO,尽可能将磁盘IO转化为内存IO。本文先从 MySQL 数据库IO相关参数(缓存参数)的角度来看看可以通过哪些参数进行IO优化。

继续阅读全文

04

MySQL的key_buffer_size参数

缓存myisam表的索引块大小,可以被所有进程所共享。当设置key_buffer_size,操作系统不会马上分配key_buffer_size设置的值,而是在需要的时候,再分配的。可以设置多个key_buffer,当设置不是默认key_buffer为0时,mysql会把缓存的索引块移到默认的key_buffer中去并删除不再使用的索引块。Myisam表中只能cache索引块,不能cache数据块。

继续阅读全文

14

mysql的缓存机制

昨天发现一个很奇怪的问题,运营说有一条帖子已经删除了,但是还是显示,显示发现有文件缓存,删除后还是会生成,怀疑是数据库里没有被删除。进数据库一看,表坏了,根本没有办法进行任何操作(奇怪)。没办法,先修表,修好后通过phpmyadmin查询没有改记录,进shell下也找不到(有点意思)。于是分析程序,程序确可以把数据查出来(邪了)。直接把程序里的sql在mysql里执行,出数据了(有点眉目了),怀疑是mysql缓存的问题。有点不明白,数据库里肯定没有那条数据了,说明执行了delete,但为什么缓存还生效呢?不管了,先重启数据库,问题解决。

继续阅读全文

15

InnoDB的缓存替换策略及其效果

我们开发自己的存储引擎页面缓存替换策略的过程中主要是参考了InnoDB与LRU-K算法。InnoDB缓存替换策略使用分代与LRU相结合的方式。分为old和young两个分代,系统维护old分代占总buffer大小的3/8左右。当一个页面第一次被访问时,是加入到old分代的lru头。并不是每次访问一个页面时就将这个页提到lru的头部,而是在这个页面在LRU中的位置调整后,是否有很多页面已经被替换出去,若有,则将这个页面移到LRU头。系统在每个页记录调整该页在lru中位置当前系统总共替换了多少个数据页,比较页中记录的这个计数与系统全局页替换计数,就可以发现上次调整这个页在lru链表中位置后,系统中又有多少个页被替换,若比较多,则再次调整该页在lru中的位置。由于第一次访问的页被加入到old分代中,因此一次表扫描不会导致young分代中的页被替换出去。

继续阅读全文