实战6、mysql基础-数据类型选择__周一 2018.7.2

经历了前的课程,基本算是把MySQL DBA基础过完:
1. MySQL几个版本的发展情况
2. MySQL标准化安装,MySQL多实例安装
3. MySQL Client类工具使用
4. MySQL sysbench压测,给MySQL搞点压力来模拟工作的实测环境
5. MySQL用户管理及权限公配,密码相安全问题。 GUI工具推荐。

本周计划

周一
1. 简单介绍一下MySQL内的目录结构(给裁剪MySQL目录一个参考)
2. 数据库里对象分类识别,全面认识一下今后要打交道的对象
3. 听故事学习MySQL数据类型,为Schema设计做准备(可能一次讲不完)

周三
1. MySQL存储引擎的特点,针对业务选择合理的存储引擎
2. 介绍MySQL复制原理及应用场景

本周内容以: 数据类型选择和复制原理及搭建为重点。

replication-manager
mysql目录结构:

  • ibdata文件,内部数据字,undo文件

    • 插入撤销日志
    • 更新撤销日志
  • ib_logfile文件,

    • 事物记录
    • 重做日志,redo文件
    • 。。

frm:元数据
ibd表空间

日志文件

  • 说明
    • 可能会占用大量的磁盘空间
    • 部分日志可以存在表里
  • 分类
    • binlog,也称变更日志,工作在server层,作用复制、恢复
    • errorlog
    • slowlog
    • relaylog
    • generallog
    • auditlog
    • ——————————–
    • redolog ,引擎层
      long_query_time=10 -> 1
      看看形成的binlog数量,优化后,set global long_query_time=0.5;
      1s = 1000ms
      0.2 =200 毫秒
  • 日志文件参数
    这里写图片描述

    配置日志过期时间、max值
    expire-logs-days=3-7
    max_binlog_size
    二进制日志:
    这里写图片描述

5.7默认配置binlog_format=row
gtid_mode=on
binlog 记录的格式的对比:
这里写图片描述

基于row格式的典型的bug:
案例1:

update tb set col1='10'  where id=10;  //案例1

案例2:

update tb set col1='abc' where col3='10'  limit 1;  //案例2,在主从库上执行的结构是不一样的

案例3:

sysdate()   //一些系统函数在不从库上也有可能不一致
uuid()

查询二进制binlog文件:

//列出当前日志文件及大小
show  binary  logs;     

//显示mysql当前日志及状态【super,replication,client权限】
show  master  status;  

//mysql的binlog是以事件event为单位存储到日志中的,一个insert,update由多个event组成。(positon:位置、字节偏移量)
show  binlog events in 'mysql-bin.000010';  

查看binlog

mysqlbinlog -v -v --base64-output=decode-rows mysql-bin.000010  >1.sql

维护:
删除

 - 基于事件删除:
     - set  global expire_logs_days=7;
     - purge binary logs before now()-interval  3 days;
- 根据文件名删除:
        - purge binary logs to 'mysql-bin.000010';

5.7binlog是以”天”为单位保存的,v8.0 -> s
percona server 可以保存binlog个数

审计日志:
说明:
是官方收费组建

  • 需要购买企业版
  • 基于策略的日志记录
  • 通过audit_log_policy选项设置
  • 提供日志记录选项ALL、NONE、LOGINS或QUERIES,默认ALL

在日志文件中生成一个服务器活动审计记录
- 内容取决于策略,可能包括:
- 在系统上发生的错误的记录
- 客户机连接和断开连接的事件
- 客户机在连接期间执行的操作
- 客户机访问的db、tb
每个审计记录的timestamp采用UTC格式,NAME属性代表事件类型。例如”connect“表示登陆事件,”QUIT”表示客户机断开连接
操作:
需要安装audit_log插件,请使用INSTALL PLUGIN语法,如:
INSTALL PLUGIN audit_log SONAME ‘audit_log.so’;
或者可以在server启动时设置 Plugin-load选项:【mysqld】

这里写图片描述

总结:
认识information_schema库
学习利用I_S的字典信息生成语句
I_S时内存库,只读
存储server的统计信息(状态便令,设置,连接)
该库不持久化,”虚拟db“
可以通过select访问

I_S重要对象

select table_name from information_schema.tables  wehre table_schema='information_schema'  order by table_name;

常见用法:
select table_name,engine from information_schema.tables where table_schema=’db_01’;

select character_set_name,collation_name from I_S.collations where is_default=’Yes’;

select table_schama,count(*) from I_S.tables group by table_schame;

只要能写入binlog的,都会被复制,如果没被复制,可能时从库开了过滤规则。
IS作用:
比如统计所有库的大小:

#以 “G” 为单位
select  sum(data_length+index_length)/1024/1024/1024 as G  from tables where table_schema='db_01';   

统计所有数据大小、索引大小

select sum(data_length)/1024/1024  as dataMB,sum(index_length)/1024/1024 as indexMB from tables where table_schema=db_01=  group  by table_name;

统计每张表的大小:

这里写图片描述

I_S 是字典类的基表。tables、innodb_trx、processlist用的比较多。
P_S:性能类的基表,非人类能阅读的
sys库 是人类能阅读的

常见用法 -> 生成语句
这里写图片描述

可以结合into outfile使用
【mysqld】
secure_file=priv=/tmp/
核心语句:

##show
#一般用法
show databases;
show tables;
show processlist;
show create table  <tb_name>;
show index from <tb_name>;
show open tables;
show table status;

# show 还支持和like &  where 使用
show databases like 'db_%';
show columns from db_01  where 'Default' is null;
show character set;
show collation;

MySQL数据类型选择

整型:tinyint / smallint / mediumint / int / bigint
浮点型:float / double
日期型:datetime / timestamp
字符型:char / varchar / text / blob & utf8 /utf8mb4 …
字段选择的规范


整型:

范围、长度:
这里写图片描述

原则:够用的前提下,越小越好
int:有符号 pow(2,31)-1
无符号 pow(2,32)-1
int(1) 是修饰符:

            create table t1(id int(1));
            insert into t1(id)  values(pow(2,31)-1);
            select * from t1;   //插入成功!
int 和 mediumint 如果join一下,如果由索引的话,是用不到索引的。
自增序列,建议无符号的,unsigned。
如果由大量删除、写入,建议bigint。

类型转移:
int(11) ,11是修饰符,不是长度限制
oracle,number(11),11是长度限制
int(8) ,zerofill,zerofill也是修饰符,左侧补0,int(8),存储1024,显示00001024

自行测试:version 5.7是否存在数据溢出的问题。

mysql整型注意事项:

  • 数字类型后面的数字 是一个显示宽度,宽度结合zerofill才能使用。
  • 表数据 <2千万建议只考虑 tinyint,int,bigint
  • 同一个字段在其他表中要注意字段类型必须一致

浮点型

FLOAT

中了20万,1.3万人来分,最后除不尽,怎么办?
decimal,非精度 -> 精度,四舍五入
世界杯: 订单合买、订单分钱,浮点数除不尽
尽量不用浮点数,存成以分为单位即可。

  • 互联网的世界不需要浮点数
  • float(p)

    • 0 <= p <=24时,占用4字节存储空间
    • 25 <= p <=53 时,占用8字节存储空间
  • float,没有长度定义

    • 占用4字节存储空间
  • float是单精度

  • 用于存储一般精度金额
  • 建议把金额存储int型,更精确
  • float列类不指定精度时不能等值查询
    • num FLOAT,where num=0.12,查到结果为空,需要用范围查询
    • num FLOAT(9,7),where num=0.12,可查到

DECIMAL

精确的十进制浮点型,高精度计算
M最大65(默认10),D最大30(默认0)
小数点后面的位数超限后,自动四舍五入(SQL_MODE=”时)
非常占用空间,c1 decimal(11) = c1(int),都是占用11个字节

日期型

DataType Storage Required Before MySQL Storage Required as of MySQL 5.6.4
YEAR 1 byte 1byte
DATE 3 bytes 3bytes
TIME 3 bytes 3 bytes + fractional seconds storage
DATETIME 8 bytes 5 bytes + fractional seconds storage
TIMESTAMP 4 bytes 4 bytes + fractional seconds storage
Fractional Seconds Storage Required
0 0 byte
1,2 1 bytes
3,4 2 bytes
5,6 3 bytes

TIME(0),TIME(2),TIME(4),TIME(6),分别需要3,4,5,6字节
优先用TIMESTAMP,其次时DATETIME

  • timestamp、datetime从mysql5.6.5开始均支持自动更新为current_timestamp
  • 日期转换
    • cast(datetime_col as date)
    • select now()+0;
  • 日期运算
    • select ‘2018-12-31 23:59:59’ + interval 1 second;
    • date_add(date,interval expr unit) / date_sub(date,interval expr unit)

select count(*) from sys_config;

案例:数据就一行,出现在慢查询slow.log里,原因把大字段设置成null了。

字符型

char和varchar的对比:来自官网dev.mysql.com

这里写图片描述

案例:70G表 -> 7G
调整了text字段,

可以查看排序

show global variables like '%sort%';

排序时按照字段实际长度,还是按照字段定义长度分配呢?

max_length_for_sort_data | 1024
max_sort_length | 1024

  • varchar是变长类型,需要额外1-2字节
  • varchar实际存储长度超过255字节时,会被当做TEXT处理
  • 所有varchar列的总长度时65535字节(实际上是65533)
  • 实际存储字节数:字符数 * 字符集字节数(utf8是3字节)
  • 字符集是utf8mb4时,实际可存储字符数时FLOOR(65533/4)=16384

开发规范:
https://github.com/zhishutech/mysql-sql-standard/blob/master/schema/field_rule.md

看信用卡、身份证怎么存的。
要是text需要拆分一下
先写binlog,再做事务提交
先引擎层,->再server

猜你喜欢

转载自blog.csdn.net/ha_123_qq/article/details/80956018