layout: post

title: "MySQL体系结构与数据类型"

date: 2018-02-26

categories: MySQL

tags: MySQL

一、MySQL里的对象

数据库

--->表--->字段/索引

--->存储过程

--->触发器

--->事件

--->...

1.1 了解及创建表

  1. -- 登录数据库
  2. mysql -S /tmp/mysql3376.sock
  3. -- 查看当前有哪些数据库
  4. show databases;
  5. information_schema 字典库
  6. performance_schema 性能相关的字典库
  7. -- 创建数据库
  8. create database wubx;
  9. -- 创建的数据库对应datadir下的一个目录
  10. /data/mysql/mysql3376/data/wubx
  11. -- mysql里把view当成Tb对待了
  12. -- MySQL是一个面向存储引擎解决方案的DB
  13. -- 查看mysql的引擎
  14. show engines;
  15. -- 还有其他引擎 inforbright/InfiniDB/Spider/dblink:connect
  16. -- OLTP环境:推荐使用InnoDB
  17. -- Memory引擎的一个坑
  18. -- 对于内存表,数据库重启时,系统会自动发起一个truncate table mem_tb
  19. -- 对于内存表,最好的方法是:在复制中最好忽略
  20. -- 调用关系
  21. mysql.server->mysqld_safe->mysqld

1.2 drop、truncate和delete的区别

  1. drop database test;
  2. truncate table mysql.db;

https://www.cnblogs.com/zhizhao/p/7825469.html

从速度上来说:drop > truncate > delete

怎么用:

  • 删除部分数据用delete
  • 删除表用drop
  • 如果想保留表而将所有数据删除且和事务无关用truncate
  • 和事务有关或想触发trigger用delete
  • 如果想整理表内部的碎片,可以用truncate、reuse stroage再重新导入/插入数据

二、MySQL体系结构

2.1 架构图

能够把这个图概括性的说一遍

http://blog.csdn.net/happylee6688/article/details/47150515

1)Connectors:不同语言中与SQL的交互

下图是mysql的默认连接数

  • max_connections:整个MySQL实例的最大链接数限制
  • max_user_connections:单个用户的最大连接数,这里未指明是哪个用户表示任意一个用户

2)Management Services & Utilities:系统管理和控制工具

3)Connection Pool:连接池

管理缓冲用户连接、线程处理等需要缓存的需求

4)SQL Interface:SQL接口

接受用户的SQL命令,并且返回用户需要查询的结果

5)Parser:解析器

验证和解析SQL

6)Optimizer:查询优化器

查询前对SQL进行优化

  1. 接入层:负责认证,每个连接都是一个线程,分配PGA
  2. Serv 包括:SQL接口,解析,优化,Cache/buffer
  3. 存储引擎
  4. 文件系统 推荐文件系统 xfs
  5. MySQL里,每个连接都是一个线程
  6. 一个系统的并发度是有限的
  7. 线程数太多,反而系统的处理能力下降
  8. 随着连接数上长,反而性能下降
  9. 版本对应的最大连接数
  10. 5.1 < 64
  11. 5.5 < 128
  12. 5.6 < 200
  13. 5.7 < 200,300
  14. 一个问题:
  15. 前端:LVS挂了5WEB
  16. 后端:1Cache3DB
  17. 单组DB连接数达6千多
  18. 解决方案:
  19. 1.引入中间件kingshard
  20. 2.thread-pool percona,mariadb属于自带的免费的

2.2 MySQL都有哪些日志

  1. error log 错误日志

    看[ERROR]和[WARNING]

  2. general log

    默认没有打开

    打开之后有什么用呢?

    分析mysqldump的原理

    分析mydumper的原理

    分析innbackupex的原理

    1. # 全局
    2. set global general_log=on;
    3. # session
    4. set general_log=on;
    5. # 查看日志输出到哪?
    6. show global variables like "%general%";
    7. # 默认输出路径在
    8. datadir/`hostname`.log
  3. binary log

    所有写操作都会在binary log中记录

    数据库的复制也是使用的binary log

    https://github.com/wubx/mysql-binlog-statistic

  4. slow log

    long_query_time = 10s

    建议改成1s

    DML语句(INSERT,UPDATE,DELETE)在处理中锁等待的时间不记录

    SELECT语句中锁等待的时间会记录

    execute_time > long_query_time

    execute_time不包含DML中的锁等待时间

2.3 看MySQL源码小技巧

没有目的的看源码没有产出

拿错误日志搜源码,不一定看源码,看附近的注释

Linux的bug社区:https://bugs.mysql.com

三、Data Types

https://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html

数据类型

为了数据库跑的更快,选择一个合适的数据类型

实质是:节省IO

所有的SQL调优99%都是节省IO

IOPS (Input/Output Operations Per Second),即每秒进行读写(I/O)操作的次数

15000转/分的硬盘,每秒250次+换道延迟--->每秒150

pic卡 10-45w IOPS

一个InnoDB的Page16K

文件系统里一个block4k

机械硬盘一个扇区512byte

iops很高,原因是raid卡缓存在工作

如果raid卡有缓存的话,一定要为raid卡装电池

每个类型占用多少字节

做容量规划要用,如果将来需要我们计算行长,就需要了

1.1 Numeric Types

  1. Integer Types

    age int(3)/age int(1)/age int(20)

    int(n)

    n表示显示宽度

    zerofill

    int做自增主键是不是太小了

    int做主键?只增不删

    bigint做主键?(单表能支撑42亿数据?)大量写大量删

    注意:类型的溢出

  2. Fixed-Point Types

    固定小数点类型

    decimal(M,N)

    M表示最大长度,也指字节

    N表示小数点后的位数

    金额全部以分为单位存储

    浮点数建索引不能进行等于操作

    用区间的形式查询

    decimal(10,0)的替代方案int(10)

  3. Floating-Point Types

    浮点数类型

    浮点数不能进行等号比较

    浮点数的运算比别人多几步

    1.1二进制怎么表示呢

    1.1+1.1呢

1.2 Date Type

下图仅供参考

timestamp,推荐datetime替换timestamp

https://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-6.html

https://dev.mysql.com/doc/refman/5.6/en/datetime.html

1.3 String Type

  1. text

    存储空间:2^16 select pow(2,16)

  2. char&varchar与text区别

    全文索引

    text不能有default值

    varchar>255byte和text处理一样

    group by和order by都不会用text类型的索引

  3. blob

    select pow(2,32)/1024/1024/1024

1.4 char&varchar

  1. 定长,变长

    char定长,varchar变长

  2. 存储长度

    char 255

    varchar 65533+2长度标记(单位bytes)

    测试最大长度是65532

  3. 额外开销

    char没有额外开销,varchar有额外开销

  4. char,容量规划

    实际分配的长度是:M字符编码的长度 等于存储空间

    char(M):M表示字符数

    latin1 一个字符就占1个字节

    utf8 一个字符占3个字节

    中文汉字在utf8占3个字节

    255
    3=765byte

  5. varchar

    小于255字节,需要1个字节开销

    大于255字节,需要2个字节的开销

    varchar(200)utf8编码,实际占用存储空间为 200*3+2(200*3=600>255)

    varchar(64)utf8编码,实际占用存储空间为64*3+1(64*3=192<255)

  6. char和varchar对空格的处理

  7. 选用char还是varchar

    一般使用InnoDB

    InnoDB本身就是一个变长存储

    trx_id,row-id,rollback,filed_pointer,null-flag,field1,...

    数据库调优:节省IO

    InnoDB 推荐varchar

    MyISAM这种堆表,char定长分配会更快一点

1.5 Best Practice

能不用浮点型就不要用

不是科研场景,基本用不到float

  1. 百分比

    用decimal

    可以转成int

  2. 坐标

    有替代方案

    转成地图位图信息

  3. 金额

    不建议用

    转化成分保存成整数

  4. 推荐datetime来替换timestamp

  5. 数据库别去存图片

    fastdfs 5.0

    ceph

    tfs

    facebook heystack

    emoji 可存,utf8mb4

  6. not null default ''

四、创建一张表有什么依据

4.1 基础知识

要有东西落地,先做出东西来

最小最合适原则,减少IO

原则 :快,反3nf

保持表的行宽尽可能的小

表的字段数小

大的字段拆分,用主键做关联

避免select *

用啥字段select啥字段

text类型的字段在查询时会先存储前20个字节到当前行,后面20字节另外存储

导致一个问题:访问一行数据,顺序IO读取-->随机IO读取

overflow page,

not null default ''

少一个字节,null占一个字节,''不占字节

innodb对NULL列需要下个额外标识

NULL影响索引

推荐 整数自增列做PK

  1. select count(*),count(1),count(col) from tb; 有啥区别

    count(*)=count(1)

    count(col)会忽略NULL值

    推荐count(*) 走主键和second index

  2. 为什么索引会对SQL有优化呢

    B+tree

    索引定义:一组有序的数据结构

    排序实现:代码实现???

    建索引过程->就是排序

    聚集索引:

    ICT index cluster table 索引聚集表

    数据以聚集索引排序存储

    聚集索引和数据一块存储

  3. InnoDB哪个索引算是聚集索引?

    主键 pk

    第一个唯一索引

    内部生成一个 rowid 6type

  4. B+tree是面向行还是page

    InnoDB的b+tree面向page

    InnoDB是面向行存储的

    Page最少要有两行记录

4.2 索引列问题

  1. 什么样的字段适合做索引

    区别度高,主键区别度100%

    变化少的

  2. 区别度大于多少才适合做索引?

    1. 计算方法:select distinct(col)/count(col) from tab;
    2. >30%
  3. 变化少的

    索引列尽可能少更新

  4. 给索引下个定义

    一组有序的数据结构

4.3 最怕

业务梳理不清楚

业务变化

4.4 三范式

属性不可分割

行的唯一性,每行一个主键

列不重复,在主键的基础下引入关系表,外键,空间换时间

4.5 创建一个集群

master/slave

mha

pxc

group_id,group_name,port,admin_user,admin_password,last_update

线上环境推荐,每一组数据的端口号都是一样的,同一组数据库使用一个端口号

4.6 步骤

  1. 先了解业务
  2. 对象梳理出来
  3. 不同的业务表用不同的前缀区分

五、实践

5.1 自增主键溢出了

结论:自增主键溢出报Dumplicate entry(主键重复)错误

  1. create table t1(id int not null auto_increment, name varchar(32), primary key(id));
  2. insert into t1(id,name) values(pow(2,31)-1,'wubx');
  3. -- 2147483647
  4. mysql> insert into t1(name) values ('test overflow');
  5. ERROR 1062 (23000): Duplicate entry '2147483647' for key 'PRIMARY'

5.2 浮点数不能进行等号比较

结论:

  1. 浮点数永远是一个近似值
  2. 指定精度可以进行等号比较了
  1. drop table if exists t1;
  2. -- 不指定精度
  3. create table t1(f float(2));
  4. insert into t1 values(1.234);
  5. insert into t1 values(5.678);
  6. select f from t1 where f=5.68;
  7. select f from t1;
  8. -- 指定精度 3,2 表示最大存储范围为[-9.99,9.99]
  9. create table t1(f float(3.2));

5.3 char/varchar最大存储长度

结论见上述总结

  1. drop table if exists t1;
  2. create table t1(name varchar(65533)) charset=latin1 engine=innodb;
  3. -- result
  4. ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
  5. create table t1(name varchar(65533)) charset=latin1 engine=innodb;
  6. -- result
  7. Query OK, 0 rows affected (0.01 sec)
  8. drop table if exists t2;
  9. create table t2(name char(255)) charset=latin1 engine=innodb;
  10. -- result
  11. Query OK, 0 rows affected (0.00 sec)
  12. insert into t2 values(repeat('a', 255));
  13. insert into t2 values(repeat('汉', 255));
  14. drop table if exists t3;
  15. create table t3(name char(255)) charset=utf8 engine=innodb;
  16. insert into t3 values(repeat('a', 255));
  17. insert into t3 values(repeat('汉', 255));

5.4 char/varchar对空格的处理

结论见上述总结

  1. create table t1(v varchar(4), c char(4));
  2. insert into t1 values('','');
  3. insert into t1 values('ab','ab');
  4. insert into t1 values('abcd','abcd');
  5. insert into t1 values('abcdefg','abcdefg');
  6. SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM t1;

六、提问

6.1 char/varchar与text的区别

6.2 三范式

七、Else

mysql workbench

ER图

icaba爱词霸

MySQL体系结构与数据类型的更多相关文章

  1. MySQl学习-——Mysql体系结构与Mysql存储引擎

    Mysql体系结构与Mysql存储引擎 Mysql体系结构 mysql体系结构图:

  2. mysql-介绍、MySQL部署、数据类型、存储引擎

    数据库介绍  什么是数据? 数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材.数据是信息的表现形式和载体,可以是符号.文字.数字.语音.图像.视频等. ...

  3. MySQL体系结构以及各种文件类型学习

    1,mysql体系结构 由数据库和数据库实例组成,是单进场多线程架构. 数据库:物理操作系统文件或者其它文件的集合,在mysql中,数据库文件可以是frm.myd.myi.ibd等结尾的文件,当使用n ...

  4. MySQL 体系结构以及各种文件类型学习汇总 (转)

    1,mysql体系结构 由数据库和数据库实例组成,是单进场多线程架构. 数据库:物理操作系统文件或者其它文件的集合,在mysql中,数据库文件可以是frm.myd.myi.ibd等结尾的文件,当使用n ...

  5. MySQL 的数值数据类型

    MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段 ...

  6. 高性能MySql进化论(一):数据类型的优化_上

    在数据库的性能调优的过程中会涉及到很多的知识,包括字段的属性设置是否合适,索引的建立是否恰当,表结构涉及是否合理,数据库/操作系统 的设置是否正确…..其中每个topic可能都是一个领域. 在我看来, ...

  7. mysql支持的数据类型及其测试

    原文:mysql支持的数据类型及其测试 1.基础知识 1.1如何来查看mysql的帮助手册 ?int Help float; 1.2创建表的规则 CREATE TABLE [IF NOT EXISTS ...

  8. MySQL中的数据类型及创建

    MySQL创建: 1.创建数据库create database test2; 2.删除数据库drop database test2;3.创建表create table ceshi(    ids in ...

  9. 【个人笔记】《知了堂》MySQL中的数据类型

    MySQL中的数据类型 1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节  范围(-128~127) smallint(m) 2个字节  范围(-32768~32767) ...

随机推荐

  1. Azure DevOps (八) 通过流水线编译Docker镜像

    上一篇文章我们完成了最简单的传统部署:上传应用到服务器上使用守护进程进行应用的部署. 本篇文章我们开始研究容器化和流水线的协作. 在开始操作之前,我们首先需要准备一下我们的dockerfile,这里我 ...

  2. 在 VC 下清空键盘缓冲区的方法

    控制台窗口是有输入缓冲区的,当你按键后程序没有来得及处理,系统会将按键缓存,等到程序获取按键的时候,系统会把缓冲区里面之前的按键返回. // 调用控制台 API,清空之前缓冲区内的所有按键. Flus ...

  3. H5扇形

    使用H5 canvas绘制的可交互扇形 requestAnimationFrame() 现有动画实现方式的不足 setTimeout和setInterval都不十分精确.为它们传入的第二个参数,实际上 ...

  4. Blazor组件自做四 : 使用JS隔离封装signature_pad签名组件

    运行截图 演示地址 响应式演示 感谢szimek写的棒棒的signature_pad.js项目, 来源: https://github.com/szimek/signature_pad 正式开始 1. ...

  5. c++对c的拓展_增强

    一:新增bool类型关键字:c中bool类型需要添加stdbool.h头文件,c++则可直接使用 void test(){ bool a=true; //c++可直接定义而c需添加头文件 true和f ...

  6. Markdown基础语法规则

    你好,世界.粗体,斜体,测试,弟弟,H2O 论文题目 一级标题 二级标题 三级标题 1 2 3 点击此链接打开网址 公式 \(y = \sin x\) \[ y = \frac{1}{x} \] dd ...

  7. Typecho文章设置永久链接

    说明 想要给Typecho文章一个独立的url,或按照自己的格式来 这时候我们就要设置永久链接 Typecho设置文章永久链接 设置伪静态 伪静态设置要取决于是nginx还是apache,详情请参考& ...

  8. 学习HTML第二天

    今日内容: HTML标签:表单标签 CSS HTML标签:表单标签 表单项标签: input:可以通过type属性值,改变元素展示的样式 type属性: text:文本输入框,默认值 placehol ...

  9. Java实现负载均衡算法--轮询和加权轮询

    1.普通轮询算法 轮询(Round Robin,RR)是依次将用户的访问请求,按循环顺序分配到web服务节点上,从1开始到最后一台服务器节点结束,然后再开始新一轮的循环.这种算法简单,但是没有考虑到每 ...

  10. go源码阅读 - sync/rwmutex

    相比于Mutex来说,RWMutex锁的粒度更细,使用RWMutex可以并发读,但是不能并发读写,或者写写. 1. sync.RWMutex的结构 type RWMutex struct { // 互 ...