摘 要
Mysql数据库是一种常见的数据管理系统,该数据库可以为很多应用软件提供后台的数据服务。Mysql数据库是开源的免费数据库,为研究者提供了研究该数据库提供了可能。MySQL的灵活性使之受到很大的欢迎,而作为MySQL数据库存储引擎,它的插件式的性能,可以根据需求而应对不同的存储引擎,也更加使MySQL方便、灵活。
本毕业设计通过对MySQL数据库存储引擎的研究了解,从而去分析数据库存储引擎的设计与实现。本文首先介绍了Mysql存储引擎的基本概述,解析存储引擎的结构,介绍经典的两种存储引擎。最后通过自定义的数据库引擎去实现数据库中的一些基本功能。
关键词:MYSQL;数据库;存储引擎
1、背景介绍
MySQL数据库是数据库系统中最受欢迎的系统。MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性【】。它是开放源代码的数据库系统,所以任何用户都可以根据自己的要求来修改,正因为这种开放性、灵活性和适用程度,使得MySQL数据库备受关注。而作为插件式存储引擎的MySQL引擎之一,使数据库更加灵活。
MySQL可以根据不同的需求来利用不同的数据库存储引擎技术来存储数【8】。MySQL有多种存储引擎,每种存储引擎都有着自己的特点与优势,其中包括:MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。正因为可以多层选择,其灵活性用来存储和检索数据,受到了用户的欢迎。
2、MySQL的存储引擎
2.1存储引擎的概述
在存储数据时是通过不同的要求而使用不同的存储方法存储在文件中。在众多的存储方法中,都有着各自的不同的功能。每一种存储方法都能行使自己的索引、锁定和存储功能。通过选择各种各样的方法,能够加强你系统的速度,从而改善系统的整体性能。这些不同的方法性能和它们自身的特色功能就称为mysql的存储引擎。MySQL有许多不同的存储引擎,每种存储引擎都有自己各自的性能和优势。用户也可以通过在数据库中设置来选择自己要求下合适的存储引擎。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性【5】。
其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储。遗憾的是,其它类型的数据库解决方案采取的“一个尺码满足一切需求”的方式意味着你要么就牺牲一些性能,要么你就用几个小时甚至几天的时间详细调整你的数据库。使用MySQL,我们仅需要修改我们使用的存储引擎就可以了。【5】
2.2常用的两种存储引擎
2.2.1 MyISAM存储引擎
MyISAM存储引擎中物理文件构成:
(1)任何存储引擎都不可或缺的存放表结构定义的.frm文件
(2)存放表数据的.MYD文件(My Data):分为静态固定长度、动态可变长度、压缩三种格式。表数据是默认不压缩的,在创建表时,可以通过ROW_FORMAT设置默认为压缩{COMPRESSED|DEFAULT},也可以通过MyISAMpack工具进行压缩。
(3)存放索引数据的.MYI文件(My Index)
MyISAM存储引擎为了保证效率,不支持事务处理,所以对事务有要求的业务场景不能使用;支持的引索类型是:BTree索引R-Tree索引Full-Text(其中最常见的BTree索引);索引为表级索引,这样能使锁定的实现成本降低;在增删改查的性能上,其中SELECT性能较高,所以适合执行查询的时候较多使用此引擎;关于COUNT(*)问题:MyISAM存储引擎记录表行数,所以在使用COUNT(*)时,只需取出存储的行数,而不用遍历表,效率较高。
2.2.2 InnoDB存储引擎
InnoDB存储引擎的物理文件构成:
(1)同MyISAM一样的是,InnoDB存储引擎也有.frm文件存储表结构定义
(2)与MyISAM的差别是,InnoDB的表数据与索引数据是存储在一起的,但在这个文件中每张表是独自占有一块表空间还是共享所有表空间,是由用户决定的。
(3)InnoDB的日志文件,支持事务及安全。InnoDB可以通过日志文件将数据库崩溃时已经完成但还没来得及将内存中已经修改但未完全写入磁盘的数据写入磁盘,也可以把已部分完成并写入磁盘的未完成事务回滚,保证数据一致性。加入失误删除日志文件会导致数据库崩溃且无法启动。
存储引擎具有良好的事务支持;全表扫描仍然会是表锁,注意间隙锁的影响读写阻塞与事务隔离级别相关,具有非常高效的缓存特性,能缓存索引,也能缓存数据;在增删改查的性能上,InnoDB主要推行增删改的性能,而且他在删除时,是对行删除,不会使表全部删除从而重建表;关于COUNT(*)问题:InnoDB存储引擎会遍历表以计算数量,效率较低。
2.2.3 MyISAM存储引擎与InnoDB存储引擎的区别
表2.1 MyISAM存储引擎与InnoDB存储引擎优缺点表
| 功能 | MYISAM | INNODB |
| 事务处理 | 不支持 | 支持 |
| 数据行锁定 | 不支持 | 支持 |
| 外键约束 | 不支持 | 支持 |
| 表空间占用 | 较小 | 较大 |
| 全文索引 | 支持 | 不支持 |
| 查询速度 | 快 | 较快 |
具体实现的差别:
InnoDB不支持FULLTEXT类型的索引;InnoDB中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可,注意的是,当count(*)语句包含where条件时,两种表的操作是一样的;对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引;DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除;LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
2.3 存储引擎的基本操作
选择存储引擎的标准:
(1) 能不能支持事务;
(2) 需不需要使用热备;
(3) 奔溃能不能修复;
(4) 能不能支持外键;
可以根据以上标准来选择自己需要的存储引擎。
查看数据库服务器中能支持的存储引擎代码:
show engines;
创建表示指定使用一个存储引擎的代码;
create table if not exists tb_staff(d int(11) default null auto_increment,name varchar(100) default '',primary key(id)engine=myisam;
查看表的存储类型代码:
(1)show create table tablename
(2)show table status from dbname where name=tablename
(3)mysqlshow -u user -p password --status dbname tablename
3、存储引擎的设计
设计自定义的存储引擎,首先得创建源文件并添加到管理文件当中,编译之后实现存储引擎的初始化;然后并对其存储引擎能够实现数据的创建、删除、打开、关闭的数据文件的一些基本功能,修改其头文件于编译来实现;最后是添加引索功能。但由于本人的操作知识有限,不能实践其设计。
本存储引擎只能实现其数据操作的一些基本功能,还有一些问题并不能解决,所以可以从以下的问题方面得以改进:对引擎代码进行更进一步的调试与改进;添加事务支持;添加自定义引擎需要编译,希望以后能够改进,从而使得自定义存储引擎能随意插件式地存储引擎。
添加一个名为ABC的存储引擎(基于mysql的example存储引擎),能实现基本操作,其修改文件如下:
[flashdb@com src]$ grep -i -s -n -r have_abc_db .
./client/mysql_priv.h:45:#ifndef HAVE_ABC_DB
./client/mysql_priv.h:46:#define HAVE_ABC_DB
./client/mysql_priv.h:1398:#ifdef HAVE_ABC_DB
./client/mysql_priv.h:1400:#define have_abc_db abc_hton.state
./client/mysql_priv.h:1402:extern SHOW_COMP_OPTION have_abc_db;
./sql/handler.cc:33:#ifdef HAVE_ABC_DB
./sql/handler.cc:320:#ifdef HAVE_ABC_DB
./sql/handler.cc:322: if (have_abc_db == SHOW_OPTION_YES)
./sql/mysqld.cc:6677:#if defined(HAVE_ABC_DB)
./sql/mysqld.cc:6678: have_abc_db= SHOW_OPTION_YES;
./sql/mysqld.cc:6680: have_abc_db= SHOW_OPTION_NO;
./sql/mysqld.cc:77:#undef have_abc_db
./sql/mysqld.cc:7800:SHOW_COMP_OPTION have_abc_db= SHOW_OPTION_NO;
./sql/ha_abc.cc:71:#ifdef HAVE_ABC_DB
./sql/ha_abc.cc:706:#endif /* HAVE_ABC_DB */
./sql/mysql_priv.h:45:#ifndef HAVE_ABC_DB
./sql/mysql_priv.h:46:#define HAVE_ABC_DB
./sql/mysql_priv.h:1398:#ifdef HAVE_ABC_DB
./sql/mysql_priv.h:1400:#define have_abc_db abc_hton.state
./sql/mysql_priv.h:1402:extern SHOW_COMP_OPTION have_abc_db;
4、总结
本毕业设计通过介绍存储引擎的基本概述,使其更加了解存储引擎的作用与其存着的意义,并分析主要使用的存储引擎,了解其两种存储引擎:MyISAM和InnoDB,从其特点与它们之间的区别来了解各种不同存储引擎的优势,最后简单的描述了自定义存储引擎的设计。
MySQL作为主流的开源数据库产品,在数据库中得以广泛的应用,而MySQL的存储引擎作为可选择的插件式的特点,可以通过不同的需求来采用不同的的数据库存储引擎技术【10】。真因为这个特点,MySQL也得以越来越受欢迎,而本文通过对MySQL数据库与其存储引擎的介绍,希望更多用户了解和针对其问题来改进存储引擎,使其更加强大。
参考文献
[1]李栋梁. 潍坊市防震减灾信息化管理系统的设计与实现[D]. 山东大学, 2013.
[2]黄帅. 流媒体服务器在视频数据传输中的应用研究[D]. 青岛科技大学, 2015.
[3]谢国印. 烟草行业客户关系管理系统的设计与实现[D]. 厦门大学, 2014.
[4]欧阳林. 教学资源库系统的设计与开发[J]. 电子制作, 2014(1):1-191.
[5]肖宏. 基于海量数据的存储与实时事件发现系统的设计与实现[D]. 北京邮电大学, 2011.
[6]王威. MySQL数据库源代码分析及存储引擎的设计[D]. 南京邮电大学, 2012.
[7]吴沧舟兰逸正张辉. 基于MySQL数据库的优化[J]. 电子科技, 2013(9):188-190.
[8]胡雯李燕. MySQL数据库存储引擎探析[J]. 软件导刊, 2012(12):131-133.
[9]郑焕时. 基于NetFlow的互联网流量分析系统的设计与实现[D]. 哈尔滨工业大学, 2015.
[10]翁捷. 曲库信息管理系统的设计与实现[D]. 北京交通大学, 2015.
致谢
经过几个月的努力,我顺利的完成了我的毕业设计。通过这几个月的毕业设计编写,是对我几年所学知识的很好总结,是过去所学知识的综合运用,是对理论进行深化和重新认识的时间活动。本毕业设计结合自己所学的知识,完成了本毕业设计,虽然写这篇毕业毕业设计的过程中,遇到了许多的问题,不过在指导老师的精心指导下,一层一层的把问题解决。这得感谢指导老师给我耐心讲解,同时查看书籍,让我在短时间内能够把这些知识吃透。从中我们也可以知道,在以后的生活中,我们遇到的问题不是一个,两个那么简单,所以通过这次毕业设计,告诫我们要不断的学习,与此同时,我们还要不断的遇见问题、解决问题,解决问题是用什么样的方法等。为了写这次的毕业设计,我不断的在网上书籍上找寻各种信息和原理,并不断的对他们进行了解分析,有什么不懂的及时向导师请教。
我还要以最真挚的感谢参与我毕业设计评审和答辩的各位老师,是您们用辛勤的劳动、无私的奉献和渊博的知识换来检验我的毕业设计。同时感谢和我一起度过这段生活的各位同事,正是由于和你们共同学习、共同工作、共同探讨,使我研究生阶段学到不少知识,再次感谢!
最后,感谢我的家人,感谢你们的理解和支持以及背后默默的付出。下载本文