mysql性能优化学习笔记-存储引擎
mysql体系架构
- 客户端(java、php、python等)
- mysql服务层(连接管理器、查询解析器、查询优化器、查询缓存)
- mysql存储引擎(innodb、myisam等)
存储引擎针对表而言的,不针对库
mysql存储引擎
mysql存储引擎之MyISAM
5.5前默认的存储引擎、临时表(查询、排序时由查询优化器生成的表)、系统表
- 特性:
- 并发性与锁级别(表级锁),
- 表损坏修复,检查
check table tablename,修复repair table tablename
此外也可以通过myisamchk对表进行修复,但是必须注意的是使用该命令进行修复时需要将mysql服务停止后进行。否则有可能对数据表造成更大的损坏。
- myisam支持全文索引
- myisam表支持数据压缩,可以使用
myisampack命令进行压缩,如:myasimpack -b -f tablename.MYI。对已经压缩后的表不能进行写操作,因此要慎重操作。
- 限制:
- 5.0前,单表文件最大支持4G。如存储大表需要修改MAX_Rows和AVG_ROW_LENGTH;5.0后默认支持256TB
- 使用场景
- 非事务型应用
- 只读类应用
- 空间类应用
mysql存储引擎之Innodb
MySQL5.5及以后版本默认存储引擎
- Innodb使用表空间进行数据存储
由innodb_file_per_table参数的值进行控制,如果为ON,则独立表空间(tablename.ibd)。如果为OFF,则会存储到系统共享表空间ibdataX。
如何选择系统表空间和独立表空间
- 系统表空间无法简单的收缩文件大小
- 独立表空间可以通过optimize table命令收缩系统文件
- 系统表空间会产生IO瓶颈
- 独立表空间可以同时向多个文件刷新数据
建议对Innodb使用独立的表空间。5.6后已经是默认方式。
- 如何将系统表空间转换为独立表空间
- 1、使用mysqldump导出所有表数据
- 2、停止Mysql服务,修改参数,并删除Innodb相关文件。如果是主从架构可以先处理从库再处理主库。
- 3、重启Mysql服务,重建Innodb系统表空间
- 4、重新导入数据
- Innodb存储引擎的特性
Innodb数据字典信息
Innodb的特性
- 事务性存储引擎
- 完全支持事务的ACID特性,
- Redo Log(重做日志,已提交事务,实现事务的持久性)和Undo Log(未提交事务进行回滚)
- Innodb支持行级锁
- 支持更多的写并发
- 行级锁由存储引擎层实现的。
- 什么是锁?
- 管理资源的并发访问
- 实现事务的隔离性
- 锁的类型
- 共享锁(读锁)
- 独占锁(写锁),排他性
- 锁的粒度
行级锁、页级锁、表级锁
- 表级锁
- 行级锁
- 阻塞和死锁
- 什么是阻塞,不同锁之间的兼容性,不同锁之间需要等待锁响应。
- 什么是死锁,两个或两个以上,互相占用资源而互相等待。一般情况下系统会自动处理。
- Innodb状态检查
shown engine innodb status
- 使用场景
- Innodb适用于大多数OLTP应用
mysql存储引擎之CSV
文件存储特点:csv文件作为存储引擎。数据以文件方式存储在文件中。
- 特点
- 以csv格式进行数据存储
- 所有的列定义不能是NULL
- 不支持索引(不适用于大表及在线系统)
- 可以直接对数据文件进行编辑
- 使用场景
- 适用于数据交换的中间表
mysql存储引擎之Archive
- 特点
- 以zlib对表数据进行压缩,磁盘I/O更少
- 存储在ARZ为后缀的文件中
存储特点:
- 只支持insert和select操作,支持行级锁
- 只允许在自增ID列上添加索引
使用场景
- 日志和数据采集类应用
mysql存储引擎之Memory
- 特点
也成为Heap存储引擎,所有数据保存在内存中。一旦mysql重启,则数据会丢失,表结构会保存。
- 功能特点:
- 支持hash索引(等值查询)和btree(范围查询)索引,默认为hash索引
- 所有字段固定长度为char(10)
- 不支持blog和text等大字段
- 使用表级锁,因此性能也不一定会很高。
- 表最大大小由参数max_heap_table_size参数决定
- 容易混淆的概念
- 临时表,系统使用的临时表;create temporary table建立的表。
- 使用场景
- 用于查找或映射表,如邮编和地区的对应表。
- 保存数据的中间表
- 混存周期性聚合数据的结果表
mysql存储引擎之Federated
- 特点
- 提供了远程访问mysql服务器上表的方法
- 本地不存储数据,数据全部存储在远程服务器上
- 本地会保存远程数据库表结构和远程连接的信息
- 如何使用
由于可以通过其他方式替代,因而默认是禁止的。但可以在启动时通过federated参数
mysql://user_name[:password]@host_name[:port]/dbname/tablename
- 使用场景
- 偶尔的统计分析和手工查询
如何选择存储引擎
参考条件
- 事务
- 备份,热备
- 崩溃恢复
- 存储引擎的特性
尽量不要同时混合使用多种存储引擎
mysql性能优化学习笔记-存储引擎的更多相关文章
- mysql性能优化学习笔记
mysql性能优化 硬件对数据库的影响 CPU资源和可用内存大小 服务器硬件对mysql性能的影响 我们的应用是CPU密集型? 我们的应用的并发量如何? 数量比频率更好 64位使用32位的服务器版本 ...
- mysql性能优化学习笔记-参数介绍及优化建议
MySQL服务器参数介绍 mysql参数介绍(客户端中执行),尽量只修改session级别的参数. 全局参数(新连接的session才会生效,原有已经连接的session不生效) set global ...
- mysql性能优化学习笔记(1)优化目的、方向及数据库准备
前言: 最近参加面试,问到了很多关于mysql的优化方面的问题,回答的不是很好,也是因为原先做的项目流量不是很大,所以对mysql优化不是太了解,所以趁着周末,恶补一下. 本文来源于慕课网sqlerc ...
- mysql性能优化学习笔记(4)索引的优化
一.选择合适的索引列 1.在where,group by,order by,on从句中出现的列 2.索引字段越小越好(因为数据库的存储单位是页,一页中能存下的数据越多越好 ) ...
- mysql性能优化学习笔记(2)如何发现有问题的sql
一.使用mysql慢查询日志对有效率问题的sql进行监控 1)开启慢查询 show variables like ‘slow_query_log’;//查看是否开启慢查询日志 ...
- mysql性能优化学习笔记(6)数据库配置优化&硬件优化
一.操作系统配置优化: 1. 网络方面,修改/etc/sysctl.conf文件,增加tcp支持的队列数,减少断开连接时,资源的回收. 2. 打开文件数的限制.修改 ...
- mysql性能优化学习笔记(5)数据库结构优化
一.选择合适的数据类型 1.使用可存下数据的最小的数据类型 2.使用简单地数据类型,Int<varchar 3.尽可能使用not null定义字段 4.尽量少用text, ...
- mysql性能优化学习笔记(3)常见sql语句优化
一.max()优化mysql> explain select max(payment_date) from payment;+----+-------------+---------+----- ...
- MySql(十一):MySQL性能调优——常用存储引擎优化
一.前言 MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.本章将介绍最为常用的两种存储引擎进行针对性的优化建议. 二.MyISAM存储 ...
随机推荐
- CSS-animations和transitions性能:浏览器到底做了什么?
CSS animations 和 transitions 的性能:浏览器到底做了什么?(译) 原文地址:http://blogs.adobe.com/webplatform/2014/03/18/cs ...
- 大熊君大话NodeJS之------Http模块
一,开篇分析 首先“Http”这个概念大家应该比较熟悉了,它不是基于特定语言的,是一个通用的应用层协议,不同语言有不同的实现细节,但是万变不离其宗,思想是相同的, NodeJS作为一个宿主运行环境,以 ...
- StarWind的安装配置
将安装包拷贝到本地后,执行以下exe文件,默认下一步,直到安装完成. 需汉化版本则将language_chinese.xml文件拷贝到以下路径: C:\Program Files\StarWind S ...
- myeclipse的项目导入到eclipse下,com.sun.org.apache.commons.beanutils.BeanUtils不能导入
com.sun.org.apache.commons.beanutils.BeanUtils这个包不能引入了怎么办自己下了个org.apache.commons的jar包了之后,改成import or ...
- 牡丹江.2014k(构造)
K - Known Notation Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Su ...
- jQuery的$.ajax示例
$.ajax({ url: 'index.php?module=products&submod=product_experience_manage&method=ajaxGetSele ...
- 利用loadrunner代理方式,录制手机APP脚本
利用loadrunner代理方式录制手机(iPhone.android)应用程序HTTP脚本 工具/原料 loadrunner 智能手机 方法/步骤 利用笔记本网卡或者类似360随身wifi,在安 ...
- Jquery简单瀑布流代码示例
最近很多网站都采用瀑布流风格设计,感觉挺有个性的,比较合适做图片类型的网站,没事仿开心网做一个瀑布流示例. 需要用到Jquery,jquery.masonry.min.js <!DOCTYPE ...
- iOS开发——UI进阶篇(六)键盘处理
一.键盘通知我们经常需要在键盘弹出或者隐藏的时候做一些特定的操作,因此需要监听键盘的状态 键盘状态改变的时候,系统会发出一些特定的通知UIKeyboardWillShowNotification // ...
- ionic不同view跳转到同一个
ionic不同view跳转到同一个 view并保留历史的路由设计 上代码:state 里面新加一个状态 .state("other", { url: "/other&qu ...