Mysql数据库表引擎与字符集

1.服务器处理客户端请求

其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。那服务器进程对客户端进程发送的请求做了什么处理,才能产生最后的处理结果呢?客户端可以向服务器发送增删改查各类请求,我们这里以比较复杂的查询请求为例来画个图展示一下大致的过程:

虽然查询缓存有时可以提升系统性能,但也不得不因维护这块缓存而造成一些开销,比如每次都要去查询缓存中检索,查询请求处理完需要更新查询缓存,维护该查询缓存对应的内存区域。从MySQL 5.7.20开始,不推荐使用查询缓存,并在MySQL 8.0中删除。

2.存储引擎

MySQL服务器把数据的存储和提取操作都封装到了一个叫存储引擎的模块里。我们知道表是由一行一行的记录组成的,但这只是一个逻辑上的概念,物理上如何表示记录,怎么从表中读取数据,怎么把数据写入具体的物理存储器上,这都是存储引擎负责的事情。为了实现不同的功能,MySQL提供了各式各样的存储引擎,不同存储引擎管理的表具体的存储结构可能不同,采用的存取算法也可能不同。存储引擎以前叫做表处理器,它的功能就是接收上层传下来的指令,然后对表中的数据进行提取或写入操作。

为了管理方便,人们把连接管理、查询缓存、语法解析、查询优化这些并不涉及真实数据存储的功能划分为MySQL server的功能,把真实存取数据的功能划分为存储引擎的功能。各种不同的存储引擎向上边的MySQL server层提供统一的调用接口(也就是存储引擎API),包含了几十个底层函数,像"读取索引第一条内容"、"读取索引下一条内容"、"插入记录"等等。

所以在MySQL server完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的API,获取到数据后返回给客户端就好了。

MySQL支持非常多种存储引擎:

存储引擎描述ARCHIVE用于数据存档(行被插入后不能再修改)BLACKHOLE丢弃写操作,读操作会返回空内容CSV在存储数据时,以逗号分隔各个数据项FEDERATED用来访问远程表InnoDB具备外键支持功能的事务存储引擎MEMORY置于内存的表MERGE用来管理多个MyISAM表构成的表集合MyISAM主要的非事务处理存储引擎NDBMySQL集群专用存储引擎

3,MyISAM和InnoDB表引擎的区别

1) 事务支持

MyISAM不支持事务,而InnoDB支持。事物:访问并更新数据库中数据的执行单元。事物操作中,要么都执行要么都不执行

2) 存储结构

MyISAM:每个MyISAM在磁盘上存储成三个文件。.frm文件存储表结构。

.MYD文件存储数据。

.MYI文件存储索引。

InnoDB:主要分为两种文件进行存储.frm 存储表结构

.ibd 存储数据和索引 (也可能是多个.ibd文件,或者是独立的表空间文件)

3) 表锁差异

MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。 InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

4) 表主键

MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。 InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。InnoDB的主键范围更大,最大是MyISAM的2倍。

5) 表的具体行数

MyISAM:保存有表的总行数,如果select count() from table;会直接取出出该值。 InnoDB:没有保存表的总行数(只能遍历),如果使用select count() from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。

6) CURD操作

MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。 InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

7) 外键

MyISAM:不支持 InnoDB:支持

8) 查询效率

MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。

推荐考虑使用InnoDB来替代MyISAM引擎,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。

另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。

9)MyISAM和InnoDB两者的应用场景:

MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。 InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。现在默认使用InnoDB。

4.了解一下字符集和乱码

字符集简介

我们知道在计算机中只能存储二进制数据,那该怎么存储字符串呢?当然是建立字符与二进制数据的映射关系了,建立这个关系最起码要搞清楚两件事儿:你要把哪些字符映射成二进制数据?也就是界定清楚字符范围。

怎么映射?将一个字符映射成一个二进制数据的过程也叫做编码,将一个二进制数据映射到一个字符的过程叫做解码。

人们抽象出一个字符集的概念来描述某个字符范围的编码规则

我们看一下一些常用字符集的情况:ASCII字符集共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符,所以可以使用1个字节来进行编码,我们看一些字符的编码方式:'L' -> 01001100(十六进制:0x4C,十进制:76)

'M' -> 01001101(十六进制:0x4D,十进制:77)

ISO 8859-1字符集共收录256个字符,是在ASCII字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母),也可以使用1个字节来进行编码。这个字符集也有一个别名latin1。

GB2312字符集收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个,其他文字符号682个。同时这种字符集又兼容ASCII字符集,所以在编码方式上显得有些奇怪:如果该字符在ASCII字符集中,则采用1字节编码。否则采用2字节编码。这种表示一个字符需要的字节数可能不同的编码方式称为变长编码方式。比方说字符串'爱u',其中'爱'需要用2个字节进行编码,编码后的十六进制表示为0xCED2,'u'需要用1个字节进行编码,编码后的十六进制表示为0x75,所以拼合起来就是0xCED275。小贴士: 我们怎么区分某个字节代表一个单独的字符还是代表某个字符的一部分呢?别忘了ASCII字符集只收录128个字符,使用0~127就可以表示全部字符,所以如果某个字节是在0~127之内的,就意味着一个字节代表一个单独的字符,否则就是两个字节代表一个单独的字符。

GBK字符集GBK字符集只是在收录字符范围上对GB2312字符集作了扩充,编码方式上兼容GB2312。

utf8字符集收录地球上能想到的所有字符,而且还在不断扩充。这种字符集兼容ASCII字符集,采用变长编码方式,编码一个字符需要使用1~4个字节,比方说这样:'L' -> 01001100(十六进制:0x4C)

'啊' -> 111001011001010110001010(十六进制:0xE5958A)小贴士: 其实准确的说,utf8只是Unicode字符集的一种编码方案,Unicode字符集可以采用utf8、utf16、utf32这几种编码方案,utf8使用1~4个字节编码一个字符,utf16使用2个或4个字节编码一个字符,utf32使用4个字节编码一个字符。更详细的Unicode和其编码方案的知识不是本书的重点,大家上网查查哈~ MySQL中并不区分字符集和编码方案的概念,所以后边唠叨的时候把utf8、utf16、utf32都当作一种字符集对待。

对于同一个字符,不同字符集也可能有不同的编码方式。比如对于汉字'我'来说,ASCII字符集中根本没有收录这个字符,utf8和gb2312字符集对汉字我的编码方式如下:utf8编码:111001101000100010010001 (3个字节,十六进制表示是:0xE68891)

gb2312编码:1100111011010010 (2个字节,十六进制表示是:0xCED2)

5.MySQL中的utf8和utf8mb4

我们上边说utf8字符集表示一个字符需要使用1~4个字节,但是我们常用的一些字符使用1~3个字节就可以表示了。而在MySQL中字符集表示一个字符所用最大字节长度在某些方面会影响系统的存储和性能,所以设计MySQL的大叔偷偷的定义了两个概念:utf8mb3:阉割过的utf8字符集,只使用1~3个字节表示字符。

utf8mb4:正宗的utf8字符集,使用1~4个字节表示字符。

有一点需要大家十分的注意,在MySQL中utf8是utf8mb3的别名,所以之后在MySQL中提到utf8就意味着使用1~3个字节来表示一个字符,如果大家有使用4字节编码一个字符的情况,比如存储一些emoji表情啥的,那请使用utf8mb4。

字符集的查看

MySQL支持好多好多种字符集,查看当前MySQL中支持的字符集可以用下边这个语句:show charset;

mysql字符集和表字符集_Mysql数据库表引擎与字符集相关推荐

  1. java 修改mysql数据库表结构_MYSQL数据库表结构优化方法详解

    摘要:这篇MySQL栏目下的"MYSQL数据库表结构优化方法详解",介绍的技术点是"mysql数据库表结构.MySQL数据库.数据库表结构.MySQL.据库表结构.数据库 ...

  2. mysql 数据库表重建_mysql 数据库表重建

    数据库内核月报 - 2015 / 09-MySQL · 捉虫动态 · 建表过程中crash造成重建表失败 问题描述 主库的create table语句传到备库,备库SQL线程执行过程中报错: Erro ...

  3. mysql数据库表重建_mysql数据库表重建

    数据库内核月报 - 2015 / 09-MySQL · 捉虫动态 · 建表过程中crash造成重建表失败 问题描述 主库的create table语句传到备库,备库SQL线程执行过程中报错: Erro ...

  4. mysql是自动表锁定吗_MySQL数据库表怎么锁定

    如果你同时运行表的检查/修复程序时,你或许不想让MySQL服务器和实用程序同时访问一个表.如果两个程序都向表中写数据显然会造成很大的麻烦,甚至会有意外情况发生.如果表正由一个程序写入,同时进行读取的另 ...

  5. mysql涉及表 规范_MySql数据库表设计规范

    建表规约 索引规约 SQL 语句 其他实战建议 选用utf8编码 可以将 MySql 的字符集由 utf8 调整为 utf8mb4.utf8mb4 是 MySql 在 5.5.3 版本之后增加的一个编 ...

  6. mysql前两个月_MySQL数据库表始终保持最近两个月的记录

    实现自动备份的方法很多,这里说的是客户需要始终保持某个表中存储两个月的记录,以便保持性能.过期数据我们建议存储到另外一个表中,以备以后查询使用. 我们采用存储过程+linux Crontab的方式实现 ...

  7. mysql 表上限_mysql 数据库表的上限

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  8. mysql 数据库表锁死_mysql 数据库表被锁住了_Mysql数据库表锁死如何处理?

    处理方式有如下三种: 1.查询不是sleep或者有状态的sql select * from `information_schema`.processlist where command !='Slee ...

  9. mysql 回退查询_MYSQL数据库表排序规则不一致导致联表查询,索引不起作用问题...

    Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题 表更描述: 将mysql数据库中的worktask表添加ishaspic字段. 具体操作:(1)数据库worktask表新添是否有图片字 ...

最新文章

  1. 公告三大“罪状”,无人驾驶公司Roadstar联合创始人被罢免
  2. 图像的多分辨率金字塔详解
  3. 北京迎“豪宅元年”:四环房价将迈入8万元时代
  4. 使用证书登陆Linux服务器
  5. 2017.3.15 余数之和sum 失败总结
  6. 如何做优化,UITabelView才能更加顺滑
  7. 百度宣布7nm制程AI芯片“昆仑芯2”实现量产
  8. mac java连通r_MacOS安装rJava
  9. ML Case Studies(0)
  10. 2020-05-22
  11. 常用经典SQL语句大全完整版--详解+实例
  12. 卓有成效的管理者—第七章 有效的决定
  13. 利用LU分解法的多项式拟合实验
  14. 文档扫描OCR识别_积累
  15. 基于Web SCADA平台构建实时数字化产线 - 初篇
  16. 串行口数据缓冲寄存器 SBUF 之 初步了解
  17. Layui开关添加弹出确认框及layer.confirm的回调
  18. CSS像素、物理像素、逻辑像素、设备像素比、PPI、Viewport
  19. 扫地机器人哪个牌子好用?高性价比扫地机器人推荐
  20. Twitter的推荐系统开源了,Twitter的推荐系统是什么样的呢?Twitter推荐系统的架构说明

热门文章

  1. 汽车OTA技术原理剖析
  2. spring boot中kafka教程
  3. 1.4_25 Axure RP 9 for mac 高保真原型图 - 案例24【中继器 - 后台管理系统2】新增数据
  4. 使用Docker安装OSX
  5. 微信小程序头像和昵称无法显示
  6. 若遇到APP无法抓包怎么办,可以通过安装Drony 进行转发抓包
  7. FastAPI 的路由介绍及使用
  8. 【学习笔记】| Java多线程基础
  9. Redis缓存雪崩、穿透、击穿,布隆过滤器,分布式锁详解
  10. ibm wkc-CP4D (watson knowledge catalog-cloud pak for data) 元数据