深入浅出mysql_存储引擎

来源:互联网 发布:胜科金仕达 待遇知乎 编辑:程序博客网 时间:2024/05/17 08:01

7.表类型 (存储引擎)的选择


7.1 MySQL 存储引擎概述


默认的存储引擎


创建新表不指定表的存储引擎,则新表是默认存储引擎的


修改默认存储引擎:
  可修改参数文件中设置 default_table_type


查看当前的默认存储引擎,可以使用以下命令:
mysql> show variables like 'table_type';
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| table_type | MyISAM |


查看当前数据库支持的引擎


方法一:
mysql> SHOW ENGINES \G
*************************** 1. row ***************************
Engine: MyISAM
Support: DEFAULT
Comment: Default engine as of MySQL 3.23 with great performance
Transactions: NO
XA: NO
Savepoints: NO
*************************** 2. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
.......


第二种方法:
mysql> SHOW VARIABLES LIKE 'have%';
+----------------------------+-------+
| Variable_name | Value |
Linux公社 www.linuxidc.com
109
+----------------------------+-------+
| have_archive | NO |
| have_bdb | NO |
| have_blackhole_engine | NO |
| have_compress | YES |
| have_crypt | YES |
| have_csv | YES |
| have_dlopen | YES |
| have_example_engine | NO |
..........
,其中 Value 显示为“DISABLED”的记录表示支持该存储引擎,但是数据库启动的时候被禁用。


创建表时设置引擎


在创建新表的时候,可以通过增加 ENGINE 关键字设置新建表的存储引擎


CREATE TABLE ai (
i bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (i)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;


修改已有表引擎


使用 ALTER TABLE 语句,将一个已经存在的表修改成其他的存储引擎


mysql> alter table ai engine = innodb;
Query OK, 0 rows affected (0.13 sec)
Records: 0 Duplicates: 0 Warnings: 0


mysql> show create table ai \G
*************************** 1. row ***************************
Table: ai
Create Table: CREATE TABLE `ai` (
`i` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`i`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.00 sec)


7.2 各种存储引擎的特性


MyISAM


存储限制:有
事务安全:不支持
锁机制:表锁
B树索引:支持
哈希索引:不支持
全文索引:支持
集群索引:不支持
数据缓存:不支持
索引缓存:支持
数据可压缩:支持
空间使用:低
内存使用:低
批量插入数据的速度:高
支持外键:不支持


特点:
MyISAM 不支持事务,不支持外键。
访问速度快,对事务完整性没有要求,或者以INSERT 或者SELECT 为主的应用可以使用该引擎。


每个MyISAM 存储三个文件:
.frm(存储表定义)
.MYD(MYDate, 存储数据)
.MYI(MYIndex,存储索引)


数据文件和索引文件可以放置在不同的目录,平均分布IO,获得更快的速度。
指定数据文件和索引文件的目录,需要在创建表时,可以通过DATA_DIRECTORY和INDEX_DIRECTORY来设定。文件路径需要时绝对路径,并有访问权限。




MyISAM表可能损坏,可以通过 CHECK TABLE检查表健康状态,REPIRE TATBLE 修复,详细步骤31章


MyISAM 支持的三种不同存储格式
静态(固定长度)表
动态表
压缩表


静态表是默认存储格式,静态表中的字段都是非变长度字段,这样每个记录都是固定长度。
优点: 存储迅速,容易缓存,出现故障容易恢复。
缺点:占用空间比动态表多。 
静态表存储时会按照列的宽度补足空格,应用访问是并不会得到这些空格,这些空格在返回应用前已经去掉。当存储时尾部真的需要空格时 也会被去掉。


动态表中包含变长字段,记录不是固定长度的。
占用空间相对较少,但是频繁的更新个删除记录会产生碎片,需要定期执行OPTIMIZE TABLE 或者 myisamchk -r命令来改善性能。并且在出现故障时恢复相对较困难。




压缩表由myisampack 工具创建,占据非常小的空间,因为每条记录是单独压缩的,所以有非常小的访问开支。


InnoDB


存储限制:64TB
事务安全:支持
锁机制:行锁
B树索引:支持
哈希索引:NO
全文索引:NO
集群索引:支持
数据缓存:支持
索引缓存:支持
数据可压缩:NO
空间使用:高
内存使用:高
批量插入数据的速度:低
支持外键:支持


特点
具有提交、回滚、和崩溃恢复能力的事务安全。
但是相对于MyISAM ,InnoDB写的效率差一些,并且会占用更多的磁盘空间以保存数据和索引。


自动增长列:


InnoDB的自动增长列可以手工插入,但是插入的值如果是0或者空时 将自动增长。可以通过ALTER TABLE tablename AUTO_INCREMENT = n 来设置自动增长的初始值。但是该值是保留在内存中的。如果重新启动 数据库,该值将丢失。
可以使用LAST_INSERT_ID(),来查询当前线程最后插入使用的值。如果插入多条,则返回第一条记录使用的值。
对于InnoDB的自增列必须是索引,如果是组合索引,必须是组合索引的第一列。但是对于MyISAM表,自动增长列可以是组合索引的其他列,这样插入记录后,自动增长列是按照前几列进行排序后自增的。


外键约束


只有InnoDB支持外键约束。创建外键时,父表必须有对应的索引,字表在创建外建时也会创建对应的索引


修改:
ALTER TABLE tablename ADD CONSTRAINT foreign_keyname   FORENTIN KEY(col_name) REFERENCES 关联表名(关联字段名);
创建:
CREATE TABEL table_name (
.....,
CONSTRAINT foreign_keyname   FORENTIN KEY(col_name) REFERENCES 关联表名(关联字段名)
) ENGINE = InnoDB;


创建外键时,可以指定在删除 更新 父表时对子表的操作。
RESTRICT
NO ACTION
CASCADE
SET NULL


例子:
CREATE TABLE city (
city_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
city VARCHAR(50) NOT NULL,
country_id SMALLINT UNSIGNED NOT NULL,
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (city_id),
KEY idx_fk_country_id (country_id),
CONSTRAINT `fk_city_country` FOREIGN KEY (country_id) REFERENCES country (country_id) ON
DELETE RESTRICT ON UPDATE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8;


在导入多表数据时,可以暂时关闭外键检查 SET FOREIGN_KEY_CHECK = 0 :导入完成再开启 SET FOREIGN_KEY_CHECK = 1;


存储方式


使用共享表空间存储


使用多表空间存储


MEMEORY


存储限制:有
事务安全:NO
锁机制:表锁
B树索引:支持
哈希索引:支持
全文索引:NO
集群索引:NO
数据缓存:支持
索引缓存:支持
数据可压缩:NO
空间使用:N/A
内存使用:中等
批量插入数据的速度:高
支持外键:NO


特点:memory 存储引擎使用存在于内存中的内容来创建表,每个memory实际只对应一个磁盘文件,格式是.frm。 memory 表访问速度非常快,因为他数据存储在内存中的,并默认使用HASH索引。 但是服务一旦关闭 表中的数据就会丢失。


创建索引的时候可以指定使用HASH还是BTREE:
CREATE INDEX mem_hash USING HASH ON tablename(col_name)


持久数据:
在启动mysql时使用 --init-file选项,把INSERT INTO ....SELECT 或者LOAD DATA INFILE 这样的语句放入文件中,这样就可以将持久的数据载入表。


数据表的大小:
每个memory 表可以放置的数据大小,收到max_heap_table_size限制,系统默认是16Mb,可以根据需要加大。此外定义表的时候可以设置MAX_ROWS子句指定表的最大长度。


适用环境:
memory主要适用那些内容变化不频繁,或者作为那么统计操作的中间结果表。
要注意数据并没有写入硬盘,重启时数据会丢失。


MERGE [mɜ:rdʒ]  


存储限制:没有
事务安全:NO
锁机制:表锁
B树索引:支持
哈希索引:NO
全文索引:NO
集群索引:NO
数据缓存:NO
索引缓存:支持
数据可压缩:NO
空间使用:低
内存使用:低
批量插入数据的速度:高
支持外键:NO


是什么


MERGE  存储引擎是一组MyISAM表的组合,这些MyISAM表的结构必须完全相同,MERGE表本身并没有数据,对MERGE标的可以进行查询、更新、删除操作,这些操作实际是对MyISAM标的操作。


定义MERGE表 


语法


CRATE TABLE tablename (
....
)ENGINE = MERGE UNION(tablename1,tablename2, ,,) INSERT_METHOD=LAST


范例


(1)创建 3 个测试表 payment_2006、payment_2007 和 payment_all,其中 payment_all是前两个表的 MERGE 表:
mysql> create table payment_2006(
-> country_id smallint,
-> payment_date datetime,
-> amount DECIMAL(15,2),
-> KEY idx_fk_country_id (country_id)
-> )engine=myisam;
Query OK, 0 rows affected (0.03 sec)
mysql> create table payment_2007(
-> country_id smallint,
-> payment_date datetime,
-> amount DECIMAL(15,2),
-> KEY idx_fk_country_id (country_id)
-> )engine=myisam;
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE TABLE payment_all(
-> country_id smallint,
-> payment_date datetime,
-> amount DECIMAL(15,2),
-> INDEX(country_id)
-> )engine=merge union=(payment_2006,payment_2007) INSERT_METHOD=LAST;
Query OK, 0 rows affected (0.04 sec)


插入操作:


对MERGE表进行插入操作,是通过INSERT_METHOD 定义插入的表,有三个值:LAST 插入到最后一张表,FIRST 插入到第一张表,NO 不允许插入


NDB


存储限制:有
事务安全:NO
锁机制:表锁
B树索引:支持
哈希索引:支持
全文索引:NO
集群索引:NO
数据缓存:支持
索引缓存:支持
数据可压缩:NO
空间使用:N/A
内存使用:中等
批量插入数据的速度:高
支持外键:NO


第三方存储引擎: TokuDB
特点:高写 高压缩性能,


7.3 如何选择合适的存储引擎


MyISAM:
如果应用是读和插入操作为主,只有很少的更新和删除操作。对事务的完整性和并发要求不高,MyISAM 非常合适


InnoDB
用于事务处理程序,支持外键。如果应用对事务完整性有较高的要求,在并发的条件下要保证数据的一致性,数据除了查询和插入操作外还有很多的更新个删除操作,那么InnoDB比较合适,


MEMORY
将所有的数据保存在RAM中,在需要快速定位数据和其他类似的数据环境下,可提供快速访问,
缺陷是对表的大小有限制,太大的表无法缓存在内存中,其次要确保表的可恢复。
用户更新不频繁的小表,用户快速得到访问结果。


MERGE:
用于将一系列等同的表逻辑的组合在一起,
MERGE表的优点在于可以突破单个MyISAM的大小限制,并通过将不同的表分布在不同的磁盘上,可以有效的改善MERGE表的访问效率。
对于数据仓库VLDB非常合适。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 列车撞上铁轨的树 铁轨拍照姿势的摆法 郑州铁轨职业技术学院 跑跑卡丁车火车铁轨宝藏 高铁轨道与普通铁轨的区别 铁通 高铁通 铁通客服 中国铁通 铁通电话 中移铁通 高铁通app 铁通营业厅 铁通卡 铁通网络 铁通手机卡 中铁通 铁通手机 移动铁通 铁通缴费 铁通公司 铁通物流 铁通是什么 铁通客服电话 铁通网上营业厅 铁通安全生产app 中国铁通集团有限公司 中国铁通网上营业厅 中移铁通千万别来 铁通宽带客服电话 中移铁通有限公司 中国铁通客服电话 高铁通app免费版 中国铁通为什么会打电话过来 盐城高铁通哪些城市 铁通宽带电话号码多少 铁通宽带客服电话多少 中国铁通宽带套餐 铁通和移动是一家吗 铁通网速太慢怎么办 中移铁通正式员工待遇