Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mysql学习笔记(八)- 服务器优化之MyIsam

Mysql学习笔记(八)- 服务器优化之MyIsam

作者头像
写一点笔记
发布于 2020-12-15 01:58:44
发布于 2020-12-15 01:58:44
54900
代码可运行
举报
文章被收录于专栏:程序员备忘录程序员备忘录
运行总次数:0
代码可运行

Mysql作为数据库在不同的机器和不同的业务环境中具有不同的调优方式,和我们做任何事情一样,涉及到边界确定的就是我们需要关注的。所有了解mysql实现的边界参数是我们调优的重点。

mysql有七组后台线程,分别为一个主线程,4个io线程,一个锁线程和一个错误监控线程。mysql5.5之后还添加了purge线程。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
master thread主要负责将脏缓存页刷新到数据文件,执行purge操作,触发检查点。合并插入缓冲区。
insert buffer thread 主要负责插入缓冲区的合并操作
read thread 负责数据库的读操作,可配置多个读线程。
write thread 负责数据库的写操作,可配置多个写线程
log thread 用户将重做日志刷新到logfile中
 purge thread执行purge操作。
  lock thread 负责锁控制和死锁检测。
错误线程 负责错误监控和处理。

我们可以使用show engine innodb status来查看这些线程的状态

mysql内存管理以及优化原则

内存优化的原则,在调整mysql内存分配时,要注意以下几点: 1.将尽量多的内存分配给mysql做缓存,弹药给操作系统和其他程序运行预留足够的内存,否则如果产生swap页交换,将严重影响系统性能 2.mysqlisam数据文件读取依赖于操作系统自身的io缓存,因此如果有myisam表,要预留更多的内存给操作系统做io缓存。 3.排序区,连接区等缓存是分配给每个数据连接会话专用的,其默认值得设置要根据最大连接数合理配置,如果设置的太大,不但浪费资源,在高并发的时候会快速将内存耗尽。

myisam内存优化

myisam存储引擎使用key buffer缓存索引块,对于mysiam表,mysql没有专门的缓存,完全依赖于操作系统的io缓存。

1.key_buffer_size的扩容

决定myisam索引缓存区的大小,影响myisam表的存取效率。可以在mysql参数文件中设置该值,一般对于myisam表,建议将1/4的内存分配给key_buffer_size

2.使用多个索引缓存

mysql通过session共享key buffer提高了myisam索引存取的性能,但是并不能消除session之间对key buffer的竞争,比如一个session如果对某个很大的索引进行扫描就可能将其他的所有数据挤出索引块,而这些索引块可能是其他session要用的数据,为了减少会话对key_buffer的竞争,mysql自5.1版本开始引入了多索引缓存的机制。

3.调整中点插入策略

某些情况下,mysql使用的是简单的最少使用策略淘汰索引数据块,这种方式可能会淘汰热数据块。除了使用会话缓存机制外还可以通过修改淘汰策略的方式。lru策略是通过构建两个链表,分别是hot链、warm链,当一个数据缓存进入内存,会先放到中点位置,也就是warm的尾部,当命中的次数达到一定量的时候会进入hot链,此后一直在hot链中循环,直到超过一定时间后会被放置到warm链的头部,在需要淘汰的时候会从warm头部进行淘汰。我们可以设置warm链和hot链的空间大小来优化缓存淘汰的问题。具体如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set global key_cache_division_limit =70
set global hot_cache.key_cache_division_limit=70

这是是设置30%的空间为热点数据区域。

4.调整read_buffer_size和read_rnd_buffer_size

要经常顺序扫描myisam表,可以通过增大read_buffer_size改善性能。但是read_buffer_size是session会话独占的,设置的过大会导致内存耗尽。

对于需要排序的sql,适当的增大read_rnd_buffer_size的值。但是也要考虑内存的问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员备忘录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
「mysql优化专题」详解引擎(InnoDB,MyISAM)的内存优化攻略?(9)
InnoDB用一块内存区域做I/O缓存池,该缓存池不仅用来缓存InnoDB的索引块,而且也用来缓存InnoDB的数据块。
java进阶架构师
2018/08/15
1.1K0
「mysql优化专题」详解引擎(InnoDB,MyISAM)的内存优化攻略?(9)
Mysql学习笔记(十) Innodb内存优化
在上一篇文章中我们说myisam的内存优化主要有四点,主要是设置索引缓存的大小key_buffer_size、使用多个索引缓存、调整中点插入策略set global key_cache_division_limit=70、调整read_buffer_size和排序空间read_rnd_buffer_size的大小。这里要注意的read_buffer_size和read_rnd_buffer_size是会话缓存,所以要合理分配。否则容易用掉很多内存。
写一点笔记
2020/12/15
1.4K0
Mysql学习笔记(十)  Innodb内存优化
Mysql升级及配置优化
[mysqld]下配置explicit_defaults_for_timestamp=true,这是相对于5.6需要添加的一个配置,具体参考https://www.jianshu.com/p/d7d364745173
kiki.
2022/09/29
1K0
Mysql升级及配置优化
【MySQL高级】应用优化及Mysql中查询缓存优化以及Mysql内存管理及优化
前面章节,我们介绍了很多数据库的优化措施。但是在实际生产环境中,由于数据库本身的性能局限,就必须要对前台的应用进行一些优化,来降低数据库的访问压力。
陶然同学
2023/02/24
1.6K0
【MySQL高级】应用优化及Mysql中查询缓存优化以及Mysql内存管理及优化
程序员必须掌握的MySQL优化指南(上)
MySQL作为最流行的关系型数据库之一,基本上每个开发人员都使用过,在平时工作中难免会遇到性能的问题,本篇从多个角度详细的介绍了,关于MySQL最常用的优化方法,包括字段类型,索引使用,SQL语句,参数调优,分库,分表,分片,缓存,以及通过中间件,NoSQL等。相信你认真读完之后一定会受益匪浅。
终码一生
2022/04/14
3580
为什么MySQL内存占用这么大? for InnoDB
这是 Innodb 引擎最重要的缓存,也是提升查询性能的重要手段。一般是global共享内存中占用最大的部分。在进行 SQL 读和写的操作时,首先并不是对物理数据文件操作,而是先对 buffer_pool 进行操作,然后再通过 checkpoint 等机制写回数据文件。占用的内存启动后就不会自动释放,默认通过LRU的算法镜像缓存淘汰,每次的新数据页,都会插入buffer pool的中间,防止前面的热数据被冲掉,长时间没动静的冷数据,会被淘汰出buffer pool,但是是被其它新数据占用了,所以一般这里不会释放的,除非重启(5.7 开始支持动态调整,默认以128M的chunk单位分配内存块)。innodb_buffer_pool主要包含数据页、索引页、undo 页、insert buffer、自适应哈希索引、锁信息以及数据字典等信息。
elontian田凌翔
2019/11/11
7.9K0
为什么MySQL内存占用这么大? for InnoDB
MySQL优化详解
升级硬件通常是我们的第一考虑,主要原因是数据库会占用大量资源。不过这种解决方案也就仅限于此了。实际上,您通常可以让CPU或磁盘速度加倍,也可以让内存增大 4 到 8 倍。
黄规速
2022/04/14
1.9K0
MySQL优化详解
MySQL内存到底消耗在哪里?
一说起MySQL使用的内存,你可能会想到各种buffer,最著名的莫过于innodb buffer pool了,它是内存使用的大户,还有sort buffer等等。除了这些buffer之外,可能还有一些细枝末节,今天我们来总结一下。
AsiaYe
2021/12/04
3.3K0
MySQL性能优化之参数配置
通过根据服务器目前状况,修改Mysql的系统参数,达到合理利用服务器现有资源,最大合理的提高MySQL性能。
跟着阿笨一起玩NET
2022/05/10
2.9K0
看MySQL的参数调优及数据库锁实践有这一篇足够了
对于访问数据库来说,建立连接的代价是比较昂贵的,因为我们频繁的创建关闭连接,是比较耗费资源的,我们有必要建立数据库连接池,以提高访问的性能。
海仔
2019/08/05
2.5K0
看MySQL的参数调优及数据库锁实践有这一篇足够了
MySQL快速入门
一直说要好好复习一下Mysql都木有时间,终于赶上最近新购买了阿里云,决定使用CentOS去试试.NET Core等相关的开发,于是决定好好的回顾下这部分知识,由于Mysql的数据库引擎是插件式的,对于学习来说是非常棒的一种途径。 Tip: 在VS中,利用EF管理Mysql,需要安装mysql-connector-net-xxxx.  先安装MySQL Connetor net,(我还安装了MySQL Connetor ODBC) 控制面版-管理工具-数据源ODBC(双击) 弹出对话框,第一个选项卡,“
用户1216676
2018/01/24
1.3K0
MySQL快速入门
Mysql调优你不知道这几点,就太可惜了
​ 1、客户端端与Mysql服务端的连接层建立连接,根据请求类型去选择相应的服务层的请求接口。
手撕代码八百里
2020/07/28
9880
性能优化-MySQL性能优化参数
对配置参数的说明: 配置参数的格式如下:(shell > mysqladmin -uroot -ppassword variables extended-status)
cwl_java
2020/02/13
7K0
Mysql优化系列(1)--Innodb引擎下mysql自身配置优化
1.简单介绍 InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。 2.之所以选用innodb作为存储引擎的
洗尽了浮华
2018/01/23
2.6K0
MySQL配置优化
转载自http://www.cnblogs.com/luyucheng/p/6340076.html
allsmallpig
2021/02/25
1.2K0
MYSQL数据优化常用配置参数
#指定MySQL可能的连接数量。当MySQL主线程在很短的时间内得到非常多的连接请求,该参数就起作用,之后主线程花些时间(尽管很短)检查连接并且启动一个新线程。 #back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。
手撕代码八百里
2020/07/28
3.7K0
mysql各个内存参数的介绍,分线程独享和全局共享两大类
mysql的内存参数分别有两大类,一类是线程独享的内存,一类是全局共享的内存 线程独享内存:join_buffer_size、sort_buffer_size、read_buffer_size顺序读取数据缓冲区、read_rnd_buffer_size随机读取数据缓冲区、bulk_insert_buffer_size批量插入暂存使用内存、tmp_table_size内部临时表使用内存、max_heap_table_size内存表使用内存 join_buffer_size:The minimum size of the buffer that is used for plain index scans, range index scans, and joins that do not use indexes and thus perform full table scans.When Batched Key Access is used, the value of join_buffer_size defines how large the batch of keys is in each request to the storage engine用于普通索引扫描、范围索引扫描和不使用索引因而执行全表扫描的联接的缓冲区的最小大小。当使用批处理密钥访问时,join_buffer_size的值定义了向存储引擎发出的每个请求中的批处理密钥的大小 sort_buffer_size:Each session that must perform a sort allocates a buffer of this size每个必须执行排序的会话都会分配一个这种大小的缓冲区 read_buffer_size:Each thread that does a sequential scan for a MyISAM table allocates a buffer of this size (in bytes) for each table it scans对MyISAM表进行顺序扫描的每个线程为其扫描的每个表分配一个这种大小(以字节为单位)的缓冲区 tmp_table_size:The maximum size of internal in-memory temporary tables. 内存中内部临时表的最大大小。mysql临时表分为两种,一种是使用create temporary table创建的,称为为外部临时表,一种是因union、order by、group by、distinct等语句产生的,称为内部临时表 max_heap_table_size:This variable sets the maximum size to which user-created MEMORY tables are permitted to grow此变量设置允许用户创建的内存表增长的最大大小
PHP开发工程师
2021/05/25
1.3K0
MySQL局域网内访问慢的原因及解决方法
转载自 http://blog.csdn.net/tiantang_1986/article/details/76890178
allsmallpig
2021/02/25
1.9K0
Mysql优化
1 . 优化不总是对一个单纯的环境进行!还很可能是一个复杂的已投产的系统。优化手段本来就有很大的风险,只不过你没能力意识到和预见到!
iginkgo18
2021/06/21
1.6K0
Mysql全面总结
常见的存储引擎有MyISAM,InnoDB,MEMORY,MERGE.今天我们就分别介绍一下,
小土豆Yuki
2021/03/18
5110
Mysql全面总结
相关推荐
「mysql优化专题」详解引擎(InnoDB,MyISAM)的内存优化攻略?(9)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验