MySQL数据库使用(二)

1.键的概念

  • :数据库中的键(key)又称为关键字,是关系模型中的一个重要概念,它是逻辑结构,不是数据库的物理部分;
  • 惟一键:即一个或者一组列,其中没有重复的记录,能够惟一标示一条记录;
  • 主键:属于惟一键,是一个比较特殊的惟一键,区别在于主键不可为空;
# id为主键  name是惟一键
create table Mark(id int not null primary key ,name varchar(250) unique key);

create table Mark(id int, name varchar(250), primary key(id), unique key(name));
  • 外键:一张表外键的值通常来讲是另外一张表主键的值,所以,外键的存在使得表与表之间能够联系起来;
create table students_to_teacher(to_id int, stu_id int, tea_id int, foreign key(stu_id) references students(id), foreign key(tea_id) references teacher(id));

2.索引的概念

  • 索引就像是一张表的目录,在查找内容以前能够先在目录中查找索引位置,以此快速定位查询数据,保存索引数据的文件通常会与保存数据的目录分开;
  • 索引应该构建在常常被用做查询条件的字段上;

3.索引类型

  • 普通索引:加速查询;
# 建立普通索引
create index 索引名称 on 表名(列名)

# 删除普通索引
drop index 索引名称 on 表名

# 查看索引
show index from 索引名
  • 惟一索引(UNIQUE KEY):加速查询 + 列值惟一(能够有null);
# 建立惟一索引
create unique index 索引名称 on 表名(列名)

# 删除惟一索引
drop unique  index 索引名称 on 表名
  • 主键索引(PRIMARY KEY):用于加速查询,只能有一个主键字段,不容许重复且不能为NULL;
  • 组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并;
  • 全文索引:对文本的内容进行分词,进行搜索;
  • 空间索引:指依据空间对象的位置和形状或空间对象之间的某种空间关系按必定的顺序排列的一种数据结构;

4.引优化策略

  • 独立使用列,尽可能避免其参与运算;
  • 左前缀索引:查询字段的时候,条件过滤时,最左前缀精确匹配;
  • 多列索引:AND 链接字段时适合多列索引,选择合适的索引次序,将选择性最高的放在左侧,范围匹配的放在右侧;

5.Innodb 存储引擎

  • 全部的InnoDB表的数据和索引存储于同一个表文件中,可是表数据和表结构分离;
-rw-rw---- 1 mysql mysql    65 8月  27 14:31 db.opt
    -rw-rw---- 1 mysql mysql  8614 8月  27 14:31 students.frm
    -rw-rw---- 1 mysql mysql 98304 8月  27 14:31 students.ibd

    db.opt文件:主要用来存储当前数据库的默认字符集和字符校验规则
    students.frm文件:存放表结构的
    students.ibd文件:存储了当前表的数据和相关的索引数据
    所以,表数据和表结构分离, 每一个表单独使用一个表文件来存储数据和索引
  • Mariadb默认的存储引擎是XtraDB,可是为了与MySQL兼容,所以也取名作InnoDB,由于MySQL的默认存储引擎是InnoDB;
  • 使用汇集索引(数据和索引在一块儿),也支持自适应hash索引,锁粒度为行级别,支持支持热备工具;
  • 支持事务的存储引擎,适合处理大量的短时间事务;

6.MyISAM 存储引擎

  • 全部的MyISAM表的数据和索引存放在不一样的文件中,表结构也分离;
-rw-rw---- 1 mysql mysql  10630 8月  27 13:12 user.frm
-rw-rw---- 1 mysql mysql    504 8月  27 13:15 user.MYD
-rw-rw---- 1 mysql mysql   2048 8月  27 14:30 user.MYI
user.frm:为表结构
user.MYD:为表数据
user.MYI:为表索引
  • 支持全文索引(fulltext index),压缩,空间函数;
  • 不支持事物,表级锁,适用于只读,读多写少;

7.MySQL的并发访问控制

  • 任何的数据集只要支持并发访问模型就必须基于锁机制进行访问控制;
  • 读锁:共享锁,容许给其余人读,不容许他人写;
  • 写锁:独占锁, 不容许其余人读和写;
  • 显示锁:用户手动请求读锁或写锁;
  • 隐式锁:由存储引擎自行根据须要加的,无需咱们管理;
  • 给表施加锁机制
# lock tables 方式施加锁
lock tables 表名称 read   # 读锁
lock tables 表名称 write  # 写锁

# 给表解锁    
unlock tables;    

# flush tables 方式施加锁
flush tables 表名称 with read lock;   #读锁
flush tables 表名称 with write lock;  # 写锁

8.MySQL事务机制

  • 一组原子性的SQL查询,或多个SQL语句组成了一个独立的单元,要么这一组SQL语句所有执行,要么所有不执行;

事物日志:html

  • 管理事物机制的日志;
  • redo日志:记录SQL执行的语句,这些SQL语句尚未同步到磁盘上,没有修改数据。若是数据奔溃,能够经过撤销SQL执行的语句来进行还原。可是,若是已经同步到磁盘上的SQL语句而言,就只能使用undo来回滚以前的数据了;
  • undo日志:记录没有执行SQL的样子,也就是记录修改数据以前的数据记录下来;

ACID机制:mysql

  • automicity:原子性,整个事物中的全部操做要么所有成功提交,要么所有失败回滚;
  • consistency:一致性,数据库老是从一个一致性状态转化为另外一个一致性状态;
  • isolation: 隔离性,事物不会相互影响,一个事物所做出的操做在提交以前,是不能为其余事物所见,隔离有多种级别,主要是为了并发;
  • durability:持久性,事物一旦提交,其所做的修改会保存在数据库中,不能丢失;

9.MySQL 查询缓存机制

  • 缓存的是查询语句的整个查询结果,是一个完整的select语句的缓存结果;
  • 哪些查询可能不会被缓存 :查询中包含UDF、存储函数、用户自定义变量、临时表、mysql库中系统表、或者包含列级别的权限表、有着不肯定值的函数;
1.query_cache_min_res_unit:查询缓存分配内存块的最小的分配单位,较小的值较少内存浪费,可是会致使更加平凡的内存分配操做 ,较大的值会致使浪费

2.query_cache_limit:可以缓存的最大查询结果,对有较大结果的查询语句,建议在select中使用SQL_NO_CACHE

3.query_cache_size:查询缓存总共可用的内存空间,单位是字节,必须是1024整数倍

4.query_cache_type:ON , OFF , DEMAND

5.query_cache_wlock_invalidate:若是某个数据表被其余的链接锁定,是否仍然能够从查询缓存中返回结果,默认值为off,表示能够返回数据,on为不容许
  • 缓存命中率
缓存命中率计算公式: Qcache_hits / (Qcache_hits+Com_select)

缓存命中率.png

10.MySQL 日志分类

  • 查询日志 :query log ,通常不启用;
general_log = {ON|OFF}  # 是否启用查询日志
general_log_file = /logs/mysql/general_log  # 当log_output为FILE类型时,日志信息的记录位置;
log_output = {TABLE|FILE|NONE} 
log_output = TABLE,FILE
  • 慢查询日志:slow_query_log ,用于对执行速率较慢的SQL语句就像过滤,有利于SQL代码的优化;
1.执行时长超出指定时长的操做 
show global variables like 'long_query_time'; 查看指定的时长
set global long_query_time = 自定义时长

2.slow_query_log = {ON|OFF}:是否启用慢查询日志
set global slow_query_log = ON

3.slow_query_log_file = mariadb1-slow.log

# 过滤条件
4.log_slow_filter=admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk 

5.log_slow_rate_limit = 1 指定记录速率

6.log_slow_verbosity = 指定内容级别
  • 错误日志:error log ,必须启用,二进制日志能够反应MySQL数据库的错误信息,用于调试;
# 错误日志信息产生的来源
    mysqld启动和关闭过程当中输出的信息;
    mysqld运行中产生的错误信息;
    event scheduler运行一个event时产生的日志信息
    在主从复制架构中的从服务器上启动从服务器线程时产生的日志信息;

# 如何开启错误日志
    log_error = /path/to/somefile
    log_warnings = {ON|OFF}:是否记录警告信息于错误日志中;
  • 二进制日志:binary log,用于经过'从新执行'日志文件中的记录的事件(SQL语句)来生成数据副本,也就是用于主从复制;
# 日志记录的格式分类
    基于“SQL语句”记录: statement
    基于“行”记录:row
    “混合模式” :mixed,系统自行判断


# 二进制日志文件的构成
    日志文件:mysql-bin.文件序号 
        例如: mysql-bin.000001
    索引文件:mysql-bin.index 
        例如:mysql-bin.index
  • 中继日志:relay log ,在主从复制架构中,从服务器用于保存从主服务器的二进制日志中读取到的时间;
  • 事务日志:transaction log ,事物日志由事物型存储引擎自行管理和使用,无需手动管理;

11.MySQL 备份策略的注意点

  • 可容忍丢失多少数据;
  • 恢复须要在多长时间内;
  • 备份的对象: 数据、二进制日志和InnoDB的事务日志、SQL代码(存储过程和存储函数、触发器、事件调度器等)、服务器配置文件;
  • 备份类型
1.站在数据集是否完整的角度上
    彻底备份,部分备份 

2.站在彻底备份的基础上
    增量备份,差别备份 

3.站在是否影响数据集读写的角度上
    热备份:在线备份,读写操做不受影响;
    温备份:在线备份,读操做可继续进行,但写操做不容许
    冷备份:离线备份,数据库服务器离线,备份期间不能为业务提供读写服务
    MyISAM存储引擎: 可以实现温备
    InnoDB存储引擎: 可以实现热备

4.站在数据存储角度上
    物理备份:直接复制数据文件进行的备份
    逻辑备份:从数据库中“导出”操做数据的SQL语句,再执行,实现备份

12.备份策略须要考虑的因素

  • 持锁的时长;
  • 备份过程时长;
  • 备份负载;
  • 恢复过程时长;

13.数据库备份具体解决方案

  • 数据:彻底备份 + 增量备份
  • 备份:物理 + 逻辑

14.备份工具介绍

  • mysqldump:逻辑备份工具,适用于全部存储引擎,温备;可是对InnoDB存储引擎支持热备;
  • scp, tar 等文件系统工具:物理备份工具,适用于全部存储引擎;冷备;彻底备份,部分备份,不适用于Innodb存储引擎;
  • lvm2的快照:几乎热备;借助于文件系统工具实现物理备份;
  • mysqlhotcopy: 几乎冷备;仅适用于MyISAM存储引擎

15.MySQL 半同步复制模型

  • 所谓的半同步复制指的是一台主节点有多个从节点,在众多的从节点之中有一个从节点在收到主节点的二进制日志信息以后,存储在中继日志中,执行中继日志后,给主节点一个反馈信息,直接点收到这个反馈信息以后,返回给执行这句SQL的ORM语句,表示数据已经存储完毕;

参考:https://www.9xkd.com/user/pla...sql

相关文章
相关标签/搜索