开发者学堂课程【云数据库优化十大典型案例:案例10:mem 100%场景优化】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/597/detail/8569
案例10:mem 100%场景优化
内容介绍
一、 内存组成
二、 Buffer pool size
三、 Thread cost memory
四、 Dictionary memory
一、内存组成
内存使用完,要关注内存的使用。有些情况下,很多用户提出疑问,数据盘占用率达到了90%、85%是不是正常的,其实大部分情况下都是正常的,因为数据的总容量是大于内存的容量的,比如数据是200GB,活跃的数据是50GB,内存是16GB,内存占用率肯定会到80%90%,deter配置参数默认参数是75%,deter配置超过75%时候,会把专业内存压缩到磁盘里,尽量维持到90%都是正常的。
内存组成:Buffer pool size ,Dictionary memory,Thread cost memory,
二、Buffer pool size
1. 创建合适的索引,避免大量的数据描写
2. 去除不必要的索引,降低内存的消耗
数据索引主要在这里消耗,因为所有的插入、更新、删除的数据,都会把相对应的数据页读到数据里,同时更新相对应的索引页,大部分的 Buffer pool size 被数据、索引占用,比如 sql 没有全盘扫描,存储大量无效数据。因为没有索引,必须把所有的数据页存在索引里,Buffer pool 就会被大量无效的数据所占满,需要创建相应的索引。同时表上有大量不必要的索引,更新插入的时候,更新索引必须要把索引读到内存当中去,这个时候 Buffer pool 的使用率就很低,之前所说的到优化原理都适合在内存优化当中。
三、Thread cost memory
1. 创建合适的索引避免排序
2. 只查询应用所需要的数据
Buffer 这些都是每个线程连接到数据库初始化分配的,每个线程比如 Stringbuffer、Thread 都是每个线程连接到数据库都是要初始化重新分配的,每个线程所发出来的查询没有合适的索引,或者说查询的数据很多,每个线程消耗的内存也是很大的,所以要控制每个线程消耗的内存。
四、Dictionary memory
1. 不要过度分表
Dictionary memory 最大可以占据 Buffer pool 的一半,不要过度的分表,分表的目的就是降低不必要的时间,需要合理的设计表结构。这个是在内存最佳实践的一个总结。