美文网首页
java数据库之存储引擎

java数据库之存储引擎

作者: 这一刻_776b | 来源:发表于2019-12-29 14:18 被阅读0次

    一、存储引擎的概述:

    1.1为什么要合理选择数据库存储引擎:

    MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。

    这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。

    1.2定义:

    数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。

    1.3存储引擎作用:

    1)设计并创建数据库以保存系统所需的关系或XML文档。

    2)实现系统以访问和更改数据库中存储的数据。包括实现网站或使用数据的应用程序,还包括生成使用SQL Server工具和实用工具以使用数据的过程。

    3)为单位或客户部署实现的系统。

    4)提供日常管理支持以优化数据库的性能。

    1.4如何修改数据库引擎:

    方式一:

    修改配置文件my.ini

    将mysql.ini另存为my.ini,在[mysqld]后面添加default-storage-engine=InnoDB,重启服务,数据库默认的引擎修改为InnoDB

    方式二:

    在建表的时候指定

    create table mytbl(   

        id int primary key,   

        name varchar(50)   

    )type=MyISAM;

    方式三:

    建表后更改

    alter table table_name type = InnoDB;

    1.5怎么查看修改成功?

    方式一:

    show table status from table_name;

    方式二:

    show create table table_name

    方式三:

    使用数据库管理工具啊。

    二、Mysql四个存储引擎

    InnoDB索引和MyISAM索引的区别:

    (1)一是主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。

    (2)二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。

    2.1 MyISAM索引实现

    2.1.1 MyISAM简介1

    MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图:

    同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

    MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。

    2.1.2 MyISAM简介2

    frm文件:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等。

    .myd文件:myisam存储引擎专用,用于存储myisam表的数据

    .myi文件:myisam存储引擎专用,用于存储myisam表的索引相关信息

    2.1.3 MyISAM特点

    (1)不支持事务操作。

    (2)不支持外键。

    (3)MyISAM保存表的具体行数,执行select count(*) from table时只要简单的读出保存好的行数即可。

    (4)对于AUTO_INCREMENT类型的字段,在MyISAM表中,可以和其他字段一起建立联合索引。

    (5)MyISAM存储引擎的读锁和写锁是互斥的,读写操作是串行的。那么,一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理呢?答案是写进程先获得锁。不仅如此,即使读请求先到锁等待队列,写请求后到,写锁也会插到读锁请求之前!这是因为MySQL认为写请求一般比读请求要重要。这也正是MyISAM表不太适合于有大量更新操作和查询操作应用的原因,因为,大量的更新操作会造成查询操作很难获得读锁,从而可能永远阻塞。这种情况有时可能会变得非常糟糕!

    2.2 InnoDB索引实现

    2.2.1 InnoDB简介1

    第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

    了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

    2.2.2 InnoDB简介2

    .frm与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等。 .ibd文件和.ibdata文件: 这两种文件都是存放innodb数据的文件,之所以用两种文件来存放innodb的数据,是因为 innodb的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是用独享表空间存放存储数据。

    独享表空间存储方式使用.ibd文件,并且每个表一个ibd文件

    共享表空间存储方式使用.ibdata文件,所有表共同使用一个ibdata文件

    觉得使用哪种方式的参数在mysql的配置文件中 innodb_file_per_table

    2.2.3 InnoDB特点

    (1)具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

    (2)支持外键。

    (3)InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。

    (4)对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引。

    (5)DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

    2.3 MEMORY存储引擎

    Memory存储引擎使用存在于内存中的内容来创建表。每个memory表只实际对应一个磁盘文件,格式是.frm。memory类型的表访问非常的快,因为它的数据是放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失掉。  MEMORY存储引擎的表可以选择使用BTREE索引或者HASH索引,两种不同类型的索引有其不同的使用范围

    Hash索引优点: Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。 Hash索引缺点: 那么不精确查找呢,也很明显,因为hash算法是基于等值计算的,所以对于“like”等范围查找hash索引无效,不支持;

    Memory类型的存储引擎主要用于哪些内容变化不频繁的代码表,或者作为统计操作的中间结果表,便于高效地对中间结果进行分析并得到最终的统计结果,。对存储引擎为memory的表进行更新操作要谨慎,因为数据并没有实际写入到磁盘中,所以一定要对下次重新启动服务后如何获得这些修改后的数据有所考虑。

    2.4 MERGE存储引擎

    实质是MyISUM表的融合,这些融合的表必须结构完全相同。MERGE本身是没有数据的。插入操作可以是first或者是last。删除只是删除MERGE表定义,并不删除真正表的数据。存储方式:.frm(文件存储表定义信息)  .MRG(描述组合表的信息,比如由哪些表组成,插入时的依据)。

    适用于:将一系列等同的MyISAM表逻辑方式组合在一起,作为一个对象引用它们。

    相关文章

      网友评论

          本文标题:java数据库之存储引擎

          本文链接:https://www.haomeiwen.com/subject/ropyoctx.html