zoukankan      html  css  js  c++  java
  • mysql存储引擎

    Innodb引擎用表空间进行数据存储:

    innodb_file_per_table

    ON:独立表空间:tablename.ibd    (mysql5.6后版本为默认配置)         .frm文件是记录数据表结构的文件,.ibd文件是innodb实际存储数据的文件

    OFF:系统表空间:ibddataX                                          .frm      ibddataX

    注意:frm文件是mysql服务器层产生的,mysql服务器层保存的东西与存储引擎是无关的

              innodb数据字典:是innodb内部产生的,可以保证事务的安全性,是本身封装了一些自定义

    查询:

    mysql> show variables like '%innodb_file_per%';
    +-----------------------+-------+
    | Variable_name | Value |
    +-----------------------+-------+
    | innodb_file_per_table | ON |
    +-----------------------+-------+
    1 row in set (0.01 sec)

    创建表,指定引擎:engine

    mysql> create table  myinnodb(id int,name varchar(10)) engine='innodb';

    比较:

    • 系统表空间无法简单的收缩文件文件大小     
    • 独立表空间可以通过optimize table 命令收缩系统文件
    • 系统表空间会产生IO瓶颈
    • 独立表空间可以同时向多个文件刷新数据    (对于频繁写入的业务特别适合)

     数据转移:   系统表空间数据------------>独立表空间数据

    步骤:

    (1)mysqldump导出所有的数据库表数据,记得数据存储过程,触发器要一起导出

    (2)停止mysql服务器,修改参数innodb_file_per_table=ON,并删除innodb相关文件

    (3)重启mysql服务,重建innodb系统表空间

    (4)重新导入数据

    • innodb是事务性的存储引擎
    • 完全支持事务的ACID特性(原子性,一致性,隔离性,持久性)
    • 日志类型: Redo log(重做日志。实现事务的持久性)   和  Undo  log (回滚日志)
    • innodb支持行级锁,可以最大程度的支持并发    注意:行级锁是在存储引擎层实现的

    mysql> show variables like 'innodb_log_buffer_size';   (redo log 默认配置缓存区的大小)

    +------------------------+----------+
    | Variable_name | Value |
    +------------------------+----------+
    | innodb_log_buffer_size | 16777216 |             数字以字节为单位的,每隔一秒都会将缓存区刷新到磁盘上,并不需要配置太大
    +------------------------+----------+

    锁:

    • 锁主要作用是管理共享资源的并发访问
    • 锁用于实现事务的隔离性

    锁的类型:

    • 共享锁(读锁)   读锁直接是相互不会阻塞的 
    • 独占锁(写锁)

    锁的粒度:

    • 表级锁
    • 行级锁    是在存储引擎中实现的

    表级独占锁演示:

    终端一:加一个表级独占锁:

    mysql> lock table myinnodb write;

    终端二:查看这个表: 结果是显示不出数据

    终端一:解锁表

    mysql> unlock tables;

    终端二:刚刚查看的表: 结果显示出了数据

    阻塞和死锁

    • 什么是阻塞   因为不同锁之间兼容性关系,有些时刻一个事务中的锁需要等待另一个事务中的锁释放,所占用的资源  eg:上边的表级锁演示 
      • 阻塞是为了确保事务可以并发且正常的运行,如果出现大量阻塞,可能是有些表出现了慢查询等一些问题,大量阻塞会导致系统的整体资源性能下降
    • 什么是死锁   指俩个或俩个以上的事务在执行过程中,相互占用了对方等待的资源而产生的异常 

     innodb状态检查:

    mysql> pager more;              相当于less的作用,可以对下边输出信息翻页查看

    mysql> show engine innodb statusG              所显示信息中可以看到读跟写的进程,默认为4读4写,可配置

     Innodb适用场景:

    •  mysql5.7之前全文索引跟空间函数只能用myisam
    • mysql5.7之后的版本,innodb也支持全文索引、空间函数,innodb适合于大多数的OLTP应用

    mysql常用存储引擎 Myisam:   mysql5.5之前默认存储引擎

    文件系统存储特点:

    • MYD为数据文件,MYI为索引文件,frm为数据结构文件
    • 并发性和锁级别        表级锁,对于读写混合并发性并不好
    • 表损坏修复         可能会造成数据丢失    命令行工具:

    mysql> check table myarz;           检查表
    +---------------+-------+----------+----------+
    | Table | Op | Msg_type | Msg_text |
    +---------------+-------+----------+----------+
    | thetest.myarz | check | status | OK |
    +---------------+-------+----------+----------+
    1 row in set (0.00 sec)

    mysql> repair table myarz;               修复表
    +---------------+--------+----------+----------+
    | Table | Op | Msg_type | Msg_text |
    +---------------+--------+----------+----------+
    | thetest.myarz | repair | status | OK |
    +---------------+--------+----------+----------+
    1 row in set (0.01 sec)

    特性:

    • myisam表支持数据压缩     命令行:myisampack

    限制:

    • MYSQL5.0之前版本默认支持表大小为4G,如果要存储大表需要修改:MAX_Rows 和 AVG_ROW_LENGTH   这俩个参数数值相乘的大小为准
    • mysql5.0版本以后默认支持单表大小为256TB

    适用场景:

    • 非事务型应用
    • 只读类报表应用    只读之间共享锁不会堵塞
    • 空间类应用

    mysql常用存储引擎 CSV:

    文件系统存储特点:

    • 数据CSV文件以文本形式在文件中,可以直接less、more、vim去查看
    • .csv文件存储表内容      
    • .csm文件存储标的元数据如表状态和数据量
    • .frm文件存储表结构信息

    特点:

    • 以csv格式进行数据存储   
    • 所有列必须都不能是NULL的
    • 不支持索引(对于表的查询效率特别低
    • 支持对数据文件直接编辑,保存文本文件内容

    不支持表的列为NULL的演示:

     mysql> create table mycsv(id int,name varchar(10)) engine=csv;         以下报错就说明了csv索引是不支持表的列为NULL

    ERROR 1178 (42000): The storage engine for the table doesn't support nullable columns

    mysql> create table mycsv(id int not null,name varchar(10) not null) engine=csv;
    Query OK, 0 rows affected (0.02 sec)

    不支持索引的演示:

    mysql> create index idx_id on mycsv(id);
    ERROR 1069 (42000): Too many keys specified; max 0 keys allowed   0的关键键表示不支持索引

     适用场景:

    • 适合作为数据交换的中间件

              

             

    mysql常用存储引擎 Archive:

     文件系统存储特点:

    • 以zlib对表数据进行压缩,磁盘I/O更少    比如10T的数据表,如果用Archive可能只需要几百M就够了
    • 数据存储在以ARZ为后缀的文件中

    功能特点:

    • 只支持insert跟select操作
    • 只允许在自增ID列上加索引

    mysql> create table myarz(id int auto_increment not null,name varchar(10),key(id)) engine=Archive;

    mysql> delete from myarz;           1031报错表示不支持这种操作
    ERROR 1031 (HY000): Table storage engine for 'myarz' doesn't have this option

    mysql> update myarz set name='bbb' where id=1;                  
    ERROR 1031 (HY000): Table storage engine for 'myarz' doesn't have this option

    mysql> create index idx_id on myarz(id);
    ERROR 1069 (42000): Too many keys specified; max 1 keys allowed

    使用场景:

    • 日志和数据采集类应用       日志采集表,数据记录表   注意:只能收集跟记录,不能修改

     

    mysql常用存储引擎 Memory:

     文件系统存储特点:

    • 也称HEAP存储引擎,所有的数据保存在内存中
    • 数据保存在内存说明数据是易丢失的,一旦mysql服务器重启,所有memory表中的数据都会丢失,但是表结构会保留

    功能特点:

    • 支持HASH索引和BTree索引   (默认为HASH索引,等值查询HASH索引特别快,范围查询要用BTree索引
    • 所有字段都为固定长度varchar(10)=char(10)
    • 不支持BLOG和TEXT等大字段
    • 使用表级锁
    • 表的最大大小是由max_heap_table_size参数决定
      • 默认值为16M,修改以后对已经存在的memory引擎的表是无效的,只能对表重建进行生效

    不支持text大表类型

    mysql> create table mymem(id int,c1 varchar(10),c2 char(10),c3 text) engine=memory;
    ERROR 1163 (42000): The used table type doesn't support BLOB/TEXT columns

    建立索引

    mysql> create index idx_c1 on mymem(c1);

    mysql> create index idx_c2 using btree on mymem(c2);

    mysql> show create table mymem;
    +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table |
    +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | mymem | CREATE TABLE `mymem` (
    `id` int(11) DEFAULT NULL,
    `c1` varchar(10) DEFAULT NULL,
    `c2` char(10) DEFAULT NULL,
    KEY `idx_c1` (`c1`),
    KEY `idx_c2` (`c2`) USING BTREE
    ) ENGINE=MEMORY DEFAULT CHARSET=utf8 |

    查看索引

    mysql> show index from mymemG

    Column_name: c1
    Index_type: HASH

    Column_name: c2
    Index_type: BTREE

    查看表的状态信息:

    mysql> show table status like 'mymem'G

    适用场景:

    • 用于查找或者映射表,例如邮编和地区的对应表
    • 用于保存数据分析中产生的中间表
    • 用于缓存周期性聚合数据的结果表
    • 注意:memory数据容易丢失,所以要求数据可以再生

    mysql常用存储引擎 Federated:   当前版本mysql默认是禁止的

     文件系统存储特点:

    •  提供了访问远程mysql服务器上表的方法
    • 本地不存储数据,数据都放在了远程服务器上
    • 本地需要保存表结构和远程服务器连接的信息

    如何使用

    • 默认禁止,启动需要在启动时增加federated参数
    • mysql://user_name[:password]@host_name[:port_num]/db_name/tbl_name

    1.mysql> show enginesG

    Engine: FEDERATED
    Support: NO           默认是不支持的
    Comment: Federated MySQL storage engine

    2.在my.cnf文件配置,然后重启mysql

    #支持Federated引擎,1表示开启
    federated=1

    3.mysql> show enginesG

    Engine: FEDERATED
    Support: YES

    演示:

    创建俩个库: 一个远程,一个本地

    mysql> create database local;   本地

    mysql> create database remote;   远程

    远程数据库创建表,插入数据,创建用户并授权

    mysql> use remote;

    mysql> create table remote_fed(id int auto_increment not null,c1 varchar(10) not null default '',c2 char(10) not null default '',primary key(id))engine=innodb;

    mysql> insert into remote_fed(c1,c2) values('aaa','bbb'),('ccc','ddd'),('eee','fff');

    mysql> grant all privileges on remote.* to 'fred'@'%'  identified by '111';

    使用本地库,创建连接通道

    mysql> create table local_fed(id int auto_increment not null,c1 varchar(10) not null default '',c2 char(10) not null default '',primary key(id))engine=federated connection='mysql://fred:111@192.168.122.15:3306/remote/remote_fed';

    mysql> select * from local.local_fed;   下面报错是因为:同一个ip在短时间内产生太多(超过mysql数据库max_connection_errors的最大值)中断的数据库连接而导致的阻塞;
    ERROR 1429 (HY000): Unable to connect to foreign data source: Host '192.168.122.15' is blocked because of many connection erro

    解决方法:mysql> flush hosts;

    mysql> select * from local.local_fed;
    +----+-----+-----+
    | id | c1 | c2 |
    +----+-----+-----+
    | 1 | aaa | bbb |
    | 2 | ccc | ddd |
    | 3 | eee | fff |
    +----+-----+-----+

    适用场景

    •  偶尔的统计分析和手工查询

    如何使用存储引擎

    参考条件:

    • 事务    ------如果要支持事务的话,innodb是首选
    • 备份    ------可以在线热备的存储引擎,只有innodb拥有免费热备方案
      注意:mysqldump不算是热备,他是一种逻辑备份,在备份的时候会对数据加锁
    • 崩溃恢复   -------myisam数据比Innodb存储引擎数据更容易丢失
    • 存储引擎的特有特性    -------建议不要混合使用存储引擎

  • 相关阅读:
    nRF51800 蓝牙学习 进程记录 2:关于二维数组 执念执战
    nRF51800 蓝牙学习 进程记录 1:感想
    invokeAll和CompletionService
    数据库连接
    数据库索引
    JVM学习笔记——java内存模型
    JVM学习笔记——自动内存管理
    JAVA学习笔记——BlockingQueue接口
    JAVA学习笔记—— Executor接口
    JAVA学习笔记——并发(二)
  • 原文地址:https://www.cnblogs.com/byfboke/p/9707547.html
Copyright © 2011-2022 走看看