5. 存储引擎

1. 存储引擎(表类型)

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

show variables like '%engine%';

查看支持的存储引擎:

show engines;

修改表的存储引擎:

alter table t1 engine = innodb;

[mysqld]

default_storage_engine=myisam                 ----修改数据库默认引擎

 

2. 常用引擎介绍

                                                                                                                            MySQL存储引擎比较 - 梦里梦外 - ITeye技术网站

MyISAM

最常用, 拥有较高的插入、查询速度

支持fulltext

不支持事务, 不能建外键

 

文章表、新闻表等安全性要求不高的

对事务的完整性、并发性要求不是很高的

应用以查询和插入为主, 只有很少的更新和删除操作

 

mysql数据库中的数据是以文件的形式存储在磁盘上的,可以cp文件的方式备份

存放在my.cnf中datadir所指目录下

 

1张myisam表对应3个文件

table1.frm 存放表结构        table1.myd 存放数据          table1.myi 存放索引

定期执行optimize table t1来改善性能,整理磁盘空间

   MyISAM表还支持3中不同的存储格式:

          1        静态表           2        动态表          3        压缩表

      静态表 是默认的存储格式,静态表中的字段都是非变长的字段,优点是:存储非常迅速,容易缓存,出现故障容易恢复;缺点是:占用的空间通常比动态表多。(注意: 在存储时,列的宽度不足时,用空格补足,当时在访问的时候并不会得到这些空格)

     动态表 的字段是变长的,优点是:占用的空间相对较少,但是频繁地更新删除记录会产生碎片,需要定期改善性能,并且出现故障的时候恢复相对比较困难。

     压缩表 占用磁盘空间小,每个记录是被单独压缩的,所以只有非常小的访问开支。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

InnoDB

支持事务, 支持外键约束

相比myisam, innodb写入数据的效率差一些, 并且会占用更多的磁盘空间

订单表、资金表、 账单表、火车票表  ,对安全性要求高的, 需要事务功能的, 应选用innodb

          修改存储方式

计算机生成了可选文字: root@10Calh0St(ds)>Showvariableslike'%per_table%';
+-~~~~~~~~~~~~~~~~~~~~-~+~~~~~~一+
1Variable_name1Value!
+··~----····~~~一·~~~~~二+·~~~…+
innodb_file_per_table!ON

ibdata1 表空间文件

ib_logfile0 日志文件        ib_logfile1 日志文件

 

ls /var/lib/mysql/ds/

仅t1.frm文件(保存表结构)

数据和索引保存在表空间文件中

 

默认没有指定innodb_data_home_dir

默认在datadir下创建一个autoextend的共享表空间文件ibdata1

 

将所有库的InnoDB表的数据与索引存储在一个共享表空间文件ibdata1中,删数据后, ibdata1文件不会自动收缩

在磁盘监控时, 也许就报警不断了, 但实际上MySQL还可以运行良好

 

单个数据库的物理备份也是问题, 通常只能将数据mysqldump导出

[root@server2 database]# /usr/local/mysql56/bin/mysqldump  ds stu > /tmp/db

指定表空间文件

innodb_data_home_dir=

innodb_data_file_path=/database2/ibdata1:100M;/tmp/ibdata2:50M:autoextend

把ibdata2也指在/database2下也可

最后一个数据文件必须是自动扩充的, 也只有最后一个文件允许自动扩充

数据首先放在ibdata1中, 存满100M后, 数据就放到ibdata2中, 存满50MB后, ibdata2将自动增长

 

1. rm -f /database/ib_log* -- 可能要

2. 加2条配置项

3. 建文件夹/database2且chown

4. 启动服务

以后就只用新指定的ibdata1与ibdata2了, 原来的/database/ibdata1就没用上了, 但它里面还存有数据, 要先切回去把它里面的数据导出来

 

Innodb有两种管理表空间的方法:

1. 共享表空间, 5.5默认

2. 独立表空间, 5.6默认

 

独立表空间:

1. 每张表都有一个自已独立的表空间文件

2. 每张表的数据和索引都会存在自已的表空间文件中

drop table自动回收表空间  ,删除大量数据后可以通过alter table t1 engine = innodb;回收空间

共享表空间在insert操作上稍有优势, 其它都没独立表空间好

 

      ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

memory(heap)

表中的数据放在内存中, 没有实际存入磁盘, 一旦服务关闭, 表中的数据就会丢失

服务器需要足够的内存来存储memory表

极高的增删改查效率

当不再需要memory表里的数据时, 要释放被memory表使用的内存, 应delete from或truncate table或drop table

 

memory表仅对应1个.frm文件, 访问非常快

支持btree与hash索引, 默认使用hash索引

 

对于临时中转表, 可以用memory引擎, 速度最快

主要用于统计操作的中间结果表

select case age when 20 then salary*1. 2 when 30 then salary*1.3 else salary*1.4 end from ds.stu;

这是临时结果, 可以存到memory表t1中

create table t1()engine = memory;

insert into t1 select …

insert  into  t1    select  stuID ,stuName,age, case age when 20 then salary*1. 2 when 30 then salary*1.3 else salary*1.4  end  as salary from ds.stu

  ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

merge(mrg_myisam)

merge存储引擎是一组myisam表的组合

这些myisam表必须结构完全相同, merge表本身没有数据

 

对merge表进行的查询、更新、删除, 实际上是对内部的myisam表进行的

 

对merge表的插入操作, 是通过insert_method子句定义插入的表, 可以有3个不同的值

insert_method=first|last|no

first插入在第1张表上, last插入在最后一张表上

no或不定义这个子句, 表示不能对这个merge表执行插入操作

 

drop merge表, 只是删除merge表的定义, 对内部的myisam表无任何影响

merge表在磁盘上的对应文件

 

create table payment_11

(

id int,

money dec(6, 1)

) engine=myisam;

create table payment_12

(

id int,

money dec(6, 1)

) engine=myisam;

create table payment_all

(

id int,

money dec(6, 1)

) engine=merge union=(payment_11, payment_12) insert_method=last; 创建时不会检查11、12存不存在

通常我们使用merge表来透明地对多个表进行查询和更新操作

 

计算机生成了可选文字: 下面是常用存储引擎的适用环境。
0My1SAM:双认的MySQL插件式存储引华。如果应用是以读操作和插入操作为主,
只有很少的更新和侧除操作,并且时事务的完整性、并发性要求不是很高,那么选
择这个存储引擎是非常适合的。MylsAM是在web、数据仓储和其他应用环晚下最
常使用的存储引擎之一。
JInnoDB:用于事务处理应用程序,支持外健二如果应用对事务的完整性有比较高的
要求,在并发条件下要求数据的一致性,数据操作除了插入和查询以外,还包括很
多的更新、删除操作,那么InnoDB存储引擎应该是比较合适的选择。InnoDB存储
引擎除了有效地降低由于.,J除和更新导致的锁定,还可以确保事务的完整提交
(C。~:)和回滚(RoUback),对于类似计费系统或者时务系统等对数据准确性要
求比较高的系统,IrmoDB都是合适的选择。
JMEMORY:将所有数据保存在RAM中,在需要快速定位记录和其他类似数据的环境
下,可提供极快的访问。MEMORY的缺陷是对表的大小有限制,太大的表无法CACHE
在内存中,其次是要确保表的数据可以恢复,数据库异常终止后表中的数据是可以恢
复的。MEMORY表通常用于更新不太频繁的小表,用以快速得到访问结果。
。MERGE:用于将一系列等同的My巧AM表以过样方式组合在一起,并作为一个对
象引用它们。MERCE表的优点在于可以突破对单个MylsAM表大小的限制,并且





原文地址:https://www.cnblogs.com/51runsky/p/f6db8643b1040345c94074eecb959232.html