MySQL(九)

一、MVCC

1、简介

Multi-Version Concurrency Control 多版本并发控制,大多数的MySQL事务型存储引擎,如InnoDB,Falcon以及PBXT都不使用一种简单的行锁机制。事实上,他们都和另外一种用来增加并发性的被称为“多版本并发控制(MVCC)”的机制来一起使用。MVCC不只使用在MySQL中,Oracle、PostgreSQL,以及其他一些数据库系统也同样使用它。 你可将MVCC看成行级别锁的一种妥协,它在许多情况下避免了使用锁,同时可以提供更小的开销。根据实现的不同,它可以允许非阻塞式读,在写操作进行时只锁定必要的记录。 MVCC会保存某个时间点上的数据快照。这意味着事务可以看到一个一致的数据视图,不管他们需要跑多久。这同时也意味着不同的事务在同一个时间点看到的同一个表的数据可能是不同的。各个存储引擎对于MVCC的实现各不相同。这些不同中的一些包括乐观和悲观并发控制。

2、InnoDB引擎实现原理

InnoDB:通过为每一行记录添加两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期(或者被删除)。但是InnoDB并不存储这些事件发生时的实际时间,相反它只存储这些事件发生时的系统版本号。这是一个随着事务的创建而不断增长的数字。每个事务在事务开始时会记录它自己的系统版本号。每个查询必须去检查每行数据的版本号与事务的版本号是否相同。

3、使用其的优势

使用MVCC多版本并发控制比锁定模型的主要优点是在MVCC里, 对检索(读)数据的锁要求与写数据的锁要求不冲突, 所以读不会阻塞写,而写也从不阻塞读。 在数据库里也有表和行级别的锁定机制, 用于给那些无法轻松接受 MVCC 行为的应用。 不过,恰当地使用 MVCC 总会提供比锁更好地性能。

二、MySQL存储引擎简介

存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。 因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。

1、查看系统引擎

查看当前系统锁支持的引擎:

MariaDB [hellodb]> SHOW ENGINES\G;

查看当前所在库的所有表的信息,包括存储引擎:

MariaDB [hellodb]> SHOW TABLE status\G;

也可以查看指定表的所使用的引擎:

语法:SHOW TABLE STATUS [{FROM | IN} db_name]  [LIKE ‘pattern‘ | WHERE expr]

说明:虽然我们既可以使用LIKE或者WHERE来选择表,但是还是建议使用WHERE来选择,毕竟是精确匹配。

2、如何修改默认存储引擎

查看当前系统默认的存储引擎:

MariaDB [hellodb]> SHOW VARIABLES LIKE ‘default_storage_engine‘;
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.00 sec)

若想修改默认存储引擎,然后查出当前系统所能支持的引擎,然后根据实际需要修改。

3、关于表的属性信息说明

使用举例:

MariaDB [hellodb]> SHOW TABLE STATUS FROM hellodb WHERE Name=‘Students‘\G;
*************************** 1. row ***************************
           Name: students
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 27
 Avg_row_length: 25
    Data_length: 680
Max_data_length: 281474976710655
   Index_length: 2048
      Data_free: 0
 Auto_increment: 28
    Create_time: 2015-08-29 21:54:14
    Update_time: 2015-08-29 23:05:55
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)

下面关于各行的信息说明:

  • Name: 表名;
  • Engine :存储引擎;
  • Version:版本;
  • Row_format:行格式。

{DEFAULT|DYNAMIC|FIXED|COMMPRESSED|REDUNDANT|COMPACT}

  • Rows:表中的行数,在MyISAM存储引擎中是准确值,在InnoDB存储引擎中是估计值;
  • Avg_row_length:平均每行包含的字节数;
  • Data_length:表中数据总体大小,单位为字节;
  • Max_data_length:表能够占用的最大空间,单位为字节,0表示么有上限;
  • Index_length:索引的大小,单位为字节;
  • Data_free:对于MyISAM表,表示已经分配但尚未使用的空间,其中包含此前删除行之后腾出来的空间;
  • Auto_increment:下一个AUTO_INCREMENT的值;
  • Create_time:表的创建时间;
  • Update_time: 表数据的最后一次修改时间;
  • Check_time: 使用CHECK TABLE或myisamchk最近一次检查表的时间;
  • Collation:排序规则;
  • Checksum:如果启动,则为表的checksum;
  • Create_options:创建表时指定使用的其他选项;
  • Comment:表的注释信息;

三、MyISAM和InnoDB表的存储结构

1、MyISAM表,每表有三个文件,都位于数据库目录中

tb_name.frm: 表结构定义

tb_name.MYD: 数据文件

tb_name.MYI: 索引文件

2、InnoDB表,有两种存储方式

  • 默认:每表有一个独立文件和一个多表共享的文件;

tb_name.frm: 表结构的定义,位于数据库目录中;

ibdata#: 共享的表空间文件,默认位于数据目录(datadir指向的目录)中。

  • 独立的表空间:

tb_name.frm: 每表有一个表结构文件;

tb_name.ibd: 一个独有的表空间文件。

表空间:table space,由InnoDB管理的特有格式数据文件,内部可同时存储数据和索引 。

四、各存储引擎的特性

1、InnoDB

InnoDB,是MySQL的数据库引擎之一,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。下面列举几个其主要功能:

  • 事务
  • 外键
  • MVCC
  • 聚簇索引
  • 行级锁
  • 支持辅助索引 :聚簇索引之外的其它索引,通常称为辅助索引
  • 支持自适应hash索引
  • 支持热备份

2、MyISAM

MyISAM是默认存储引擎。它基于更老的ISAM代码,但有很多有用的扩展。(注意MySQL 5.1不支持ISAM)。 每个MyISAM在磁盘上存储成三个文件。每一个文件的名字均以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为·MYD (MYData)。

下面列举几个其主要功能:

  • 全文索引
  • 压缩:用于实现数据仓库,能节约存储空间并提升性能
  • 空间索引
  • 表级锁
  • 延迟更新索引

不支持功能:

  • 不支持事务、外键和行级锁
  • 崩溃后无法安全恢复数据

适用场景:

只读数据、较小的表、能够容忍崩溃后的修改操作和数据丢失

3、ARCHIVE

其主要功能:

  • 仅支持INSERT和SELECT,支持很好压缩功能;
  • 适用于存储日志信息,或其它按时间序列实现的数据采集类的应用;

不支持功能:

  • 不支持事务,不能很好的支持索引;

4、CSV

其主要功能:

  • 将数据存储为CSV格式;
  • 仅适用于数据交换场景;

不支持功能:

  • 不支持索引;

5、BLACKHOLE

其主要功能:

  • 没有存储机制,任何发往此引擎的数据都会丢弃;
  • 其会记录二进制日志,因此,常用于多级复制架构中作中转服务器;

6、MEMORY

其主要功能:

  • 保存数据在内存中,内存表;
  • 常用于保存中间数据,如周期性的聚合数据等;
  • 用于实现临时表;
  • 支持hash索引,使用表级锁;

不支持功能:

  • 不支持BLOB和TEXT数据类型;

7、MRG_MYISAM

其主要功能:

  • MYISAM的一个变种,能够将多个MyISAM表合并成一个虚表;

8、NDB

其主要功能:

  • MySQL CLUSTER中专用的存储引擎

9、第三方的存储引擎

OLTP(在线事务出理):

  • XtraDB:增强的InnoDB,由Percona提供;
  • PBXT: MariaDB自带此存储引擎

    • 支持引擎级别的复制、外键约束,对SSD磁盘提供适当支持;
    • 支持事务、MVCC
  • TokuDB: 使用Fractal Trees索引,适用存储大数据,拥有很压缩比;已经被引入MariaDB;

列式存储引擎:

  • Infobright: 目前较有名的列式引擎,适用于海量数据存储场景,如PB级别,专为数据分析和数据仓库设计;
  • InfiniDB
  • MonetDB
  • LucidDB

10、开源社区存储引擎

  • Aria:前身为Maria,可理解为增强版的MyISAM(支持崩溃后安全恢复,支持数据缓存);
  • Groona:全文索引引擎,Mroonga是基于Groona的二次开发版;
  • OQGraph:由Open Query研发,支持图结构的存储引擎;
  • SphinxSE:为Sphinx全文搜索服务器提供了SQL接口;
  • Spider:能数据切分成不同分片,比较高效透明地实现了分片(shared),并支持在分片上支持并行查询;

11、如何选择存储引擎

  • 是否需要事务
  • 备份的类型的支持
  • 崩溃后的恢复
  • 特有的特性

几个常用存储引擎的特点

时间: 2024-11-09 00:00:22

MySQL(九)的相关文章

mysql九大类常用函数

一.数学函数 ABS(x) 返回x的绝对值BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x) 返回大于x的最小整数值EXP(x) 返回值e(自然对数的底)的x次方FLOOR(x) 返回小于x的最大整数值GREATEST(x1,x2,...,xn) 返回集合中最大的值LEAST(x1,x2,...,xn) 返回集合中最小的值LN(x) 返回x的自然对数LOG(x,y) 返回x的以y为底的对数MOD(x,y) 返回x/y的模(余数)PI() 返回pi的值(圆周率

重修课程day45(mysql九之完结篇)

一 视图 什么是视图:视图就是一张虚拟表.方便查看. 创建视图:create view 起名 as sql语句 注意sql语句不能包括子查询. 修改视图:alter view 视图名称 as sql语句 删除视图:drop view 视图名 二 触发器 什么是触发器:由一个行为触发了某一个行为.也就是用户对于表的增删改的操作前后的行为. 创建触发器: # 插入前 CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH

Linux系统下安装mysql

一.下载 这里我创建了一目录software用于存放我们待会要下载的mysql包,先去到该目录 命令:cd /software命令:wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar 下载完成后,你会在software这个目录下看到多出了空色框的文件 二.建立用户,以及mysql的目录1.groupadd mysql #建立一个mysql的组2.useradd -r -g mysq

Linux配置MySQL

mysql 有2个跟windows不同的地方 1.my.ini 保存到/etc/my.ini2.用户权限,单独用户执行 一:下载:直接命令下载. wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar 二.建立用户,以及mysql的目录1.groupadd mysql #建立一个mysql的组2.useradd -r -g mysql mysql #建立mysql用户,并且把用户放到m

一台服务器上起2个mysql服务

一.添加组添,加用户到组,解压 groupadd mysql useradd mysql -g mysql -M -s /sbin/nologin tar -zxvf mysql-5.6.23-linux-glibc2.5-x86_64.tar.gz tar -zxvf mysql-5.7.9-linux-glibc2.5-x86_64.tar.gz mv mysql-5.6.23-linux-glibc2.5-x86_64 /mnt/sda4/mysql5.6.23 mv mysql-5.7.

安装MySQL总结

由于MySQL的版本不同,所以会有不同的安装方式.在下以Linux系统下MySQL5.1.19版本为例,进行安装,初学还望指正. 一.安装编译软件(简单的yum安装) gcc gcc-c++ ncurses ncurses-devel cmake 二.修改hosts可以解析主机名 echo "127.0.0.1    `hostname`" >> /etc/hosts 三.编译安装 # tar xvf mysql-5.5.19.tar.gz # cd mysql-5.5.1

phpstudy升级mysql数据库

因为MySQL支持全文索引的只有5.6以上,而我下的phpstudy只有5.5的版本,在导入数据库的时候因为该数据库的表内有使用全文索引,因此必须升级phpstudy的mysql版本,这里就把自己当升级过程详细记录和总结一下. 首先查看phpstudy的mysql版本: 方法一  使用mysql的version函数: select     version(); 方法二  status命令 status; 如果不想登陆mysql进行查询可以使用mysql -v和mysql --help,这里不详述

Mysql第一周

前言:好久不见,我又来写博客拉.上个月只写了几篇django-rest-framework的,而且还是根据官网的英文写的.干货不多,内心还是有点羞耻的…… 简单说下我11月去干嘛了.11月初美图给我发offer了,当时面试我也说了11月底可以去实习.感觉美图也是蛮有名气的嘛,就拿了这个offer了,现在我也是在厦门的美图公司实习,刚入职几天,正在疯狂打杂中.拿了offer后,内心那种不安全感,源于一个问题,“你行不行?”.面试时我当然自信地表现出I CAN DO IT咯,但有些东西得入职后才知道

mysql 多实例案例实战

其实Mysql多实例就是在一个 mysql 服务上面启动三个实例,相当于三个分离开来的数据库,至于为什么要做这个,你也可以选择分别安装三个MySQL,只是过于麻烦,多实例中只需要一个配置档my.cnf,并且通过mysql_330x.sock 便于管理数据库. 其实MySQL多实例之后也可以做主从同步及读写分离,跟原来是一样的,只是同步的时候端口有变化而已~ 下面我来做MySQL多实例的环境搭建,至于如何用,怎么用,那就看你需求了 安装简介 用户名:mysql 安装目录:/usr/local/my

centos7下使用mysql离线安装包安装mysql5.7

服务器环境: centos7 x64 需要安装mysql5.7+ 一.卸载CentOS7系统自带mariadb # 查看系统自带的Mariadb [root@CDH-141 ~]# rpm -qa|grep mariadb mariadb-libs-5.5.44-2.el7.centos.x86_64 # 卸载系统自带的Mariadb [root@CDH-141 ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7.centos.x86_64 # 删除etc