数据库存储引擎的应用
存储引擎:在MySQL中的数据用不同的技术存储在文件或内存中,每一种技术都是用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的、不同的功能和能力。通过选择不同的技术,能够获得额外的速度或功能,从而改善应用的整体功能。,这些不同技术以及配套的相关功能在MySQL中被称为存储引擎。是存储数据、为存储的数据建立索引、更新查询数据的各种实现方法。
查询MySQL中支持的存储引擎:
SHOW ENGINES
查询变量
SHOW VARIABLES
查看默认引擎
show variables like '%default_storage_engine%';
InnoDB存储引擎:InnoDB遵循CNU通用公开许可(GPL)发行,已经被一些重量级因特网公司所采用;InnoDB给MySQL的表提供了事务、回滚、崩溃修复能力和多版本并发控制的事务安全;在InnoDB存储引擎中,创建的表的表结构存储在.frm文件中。数据和索引存储在innodb_data_home_dir和innodb_data_file_path空间中。
InnoDB存储引擎的特性:
InnoDB对事务处理的能力,这是管理敏感数据所必需的,是MySQL其他存储引擎所无法与之比拟的。
InnoDB存储引擎中支持自动增长列AUTO_INCREMENT。自动增长列的值不能为空,且值必须唯一。MySQL中规定自增列必须为主键。
InnoDB是MySQL史上第一个提供外键约束的表引擎。
InnoDB存储引擎中,表结构存储在.frm文件中,数据和索引存储在innodb_data_home_dir和innodb_data_file_path表空间中。
优点:
良好的事务管理
崩溃修复能力
并发控制
缺点:
读写效率稍差
占用的数据空间相对比较大
使用InnoDB存储引擎的场景:
更新密集的表:InnoDB存储引擎特别适合处理多重并发的更新请求。
事务:InnoDB存储引擎是唯一支持事务的标准MySQL存储引擎,这是管理敏感数据的必需软件。
自动灾难恢复:与其他存储引擎不同,InnoDB表能够自动从灾难中恢复。
MyISAM存储引擎:在MySQL5.5之前的版本中全都使用MyISAM作为默认存储引擎
MyISAM存储引擎的文件类型:主要由三个文件组成,文件后缀分别为:.frm .MYD .MYI
MyISAM存储引擎的存储格式:
MyISAM静态:如果所有表列的大小都是静态的(即不使用xBLOB、xTEXT或VARCHAR数据类型),MySQL就会自动使用静态MyISAM格式。
MyISAM动态:如果有表列定义为动态的(使用xBLOB、xTEXT或VARCHAR数据类型),MySQL就会自动使用动态格式
补充:
尽可能使用静态数据类型,因为占用的空间更小
经常使用OPTIMIZE TABLE语句,它会整理表的碎片,恢复由于表更新和删除而导致的空间丢失。
MyISAM压缩:
有时会创建在整个应用程序生命周期中都只读的表。如果是这种情况,就可以使用myisampack工具将其转换为MyISAM压缩表来减少空间。
优点:
占用空间小
处理速度快
缺点:
不支持事务的完整性和并发性
MEMORY存储引擎:MEMORY存储引擎是MySQL中的一类特殊的存储引擎。其使用存储在内存中的内容来创建表,而且所有数据也放在内存中。
MEMORY存储引擎的文件存储形式:每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,扩展名为.frm。该文件中只存储表的结构,而其数据文件都是存储在内存中。
MEMORY存储引擎的索引类型:MEMORY存储引擎默认使用哈希(HASH)索引。其速度要比使用B型树(BTREE)索引快。
MEMORY存储引擎的存储周期:MEMORY存储引擎通常很少用到。因为MEMORY表的所有数据是存储在内存上的,如果内存出现异常就会影响到数据的完整性。如果重启机器或者关机,表中的所有数据将消失。
有点:
MEMORY表的大小是受到限制的
处理速度非常快
缺点:
数据易丢失
生命周期短
选择存储引擎场景:
InnoDB存储引擎:用于事务处理应用程序,具有众多特性。同时支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高,要求实现并发控制,那选择InnoDB存储引擎有其很大的优势。如果需要频繁的进行更新、删除操作的数据库,也可以选择InnoDB存储引擎。因为,该类存储引擎可以实现事务的提交(Commit)和回滚(Rollback)。
MyISAM存储引擎:管理非事务表,它提供高速存储和检索,以及全文搜索能力。MyISAM存储引擎插入数据快,空间和内存使用比较低。如果表主要是用于插入新纪录和读出记录,那么选择MyISAM存储引擎能实现处理的高效率。如果应用的完整性、并发性要求很低,也可以选择MyISAM存储引擎
MEMORY存储引擎:提供“内存中”表,所有数据都在内存中,数据的处理速度快,但安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMORY存储引擎。MEMORY存储引擎对表的大小有要求,不能建太大的表。所以,这类数据库只使用相对较小的数据库表。
MySQL常用数据类型
数字类型:
整数数据类型
浮点数据类型
注意:FLOAT和DOUBLE存在误差问题,尽量避免进行浮点数比较;货币等对精度敏感的数据,应该使用DECIMAL类型。
例如:DECIMAL(8,2)
如何选择合适的数据类型
选择最小的可用类型,如果值永远不超过127,则使用TINYINT比INT强。
对于完全都是数字的,可以选择整数类型。
浮点类型用于可能具有小数部分的数。
字符串类型分为3类:
普通的文本字符串类型:
存储字符串长度相同的全部使用CHAR类型;字符长度不同的使用VARCHAR类型,不预先分配存储空间,长度不要超过255.
例如:Char(10)
可变类型
可变类型的大小可以改变,TEXT类型适合存储长文本,而BLOB类型适合存储二进制数据,支持任何数据,如文本、声音和图像等。
特殊类型
注意:
BLOB、TEXT、ENUM、SET字段类型在MySQL数据库的检索性能不高,很难使用索引进行优化。如果必须使用这些类型,一般采取特殊的结构设计,或者与程序结合使用其他的字段类型替代。例如,SET类型可以使用整型(0,1,2,3...)、注释功能和程序的接查功能集合替代。
如何选择合适的字符串类型?
从速度方面考虑,要选择固定的列,可以使用CHAR类型。
要节省空间,使用动态的列,可以使用VARCHAR类型。
要将列中的内容限制在一种选择,可以使用ENUM类型。
允许在一个列中有多于一个的条目,可以使用SET类型。
如果要搜索的内容不区分大小写,可以使用TEXT类型。
如果要搜索的内容区分大小写,可以使用BLOB类型。
日期和时间数据类型
每种类型都有其取值范围,如赋予一个不合法的值,将会被“0”代替。
日期的顺序是按照标准的 ANSI SQL 格式进行输出的。