前言
数据库在计算机领域的应用十分广泛, 大家在学习数据库的时候, 一般是按照网上的基础教程可以一步步入门, 但是这仅仅只是会简单地使用数据库而已, 而要真正会使用数据库, 就需要弄清楚数据库的基本原理和组成结构. 而这样的文章在网上并不多, 因此经过我的查阅和总结, 最终写成了这篇文章, 以供大家参考, 文章末尾会给出参考地址, 有兴趣的朋友可以自行查看.
数据库结构一览
层结构
连接层主要负责安全验证和信息传输
sql 层主要处理和优化 sql
存储层存储真正的表数据
对数据库而言最重要的则是查找效率, 那么我们来理一理数据库的查询操作.
数据库中存储与查找
数据库的存储
数据库引擎
InnoDB , 2. MyIsam , 3. Memory, 4. Blackhole, 5. CSV, 6. Performance_Schema, 7. Archive, 8. Federated , 9 Mrg_Myisam
在平时使用中最多的还是 InnoDB 和 MyIsam, 以下做一些简单介绍
InnoDB
InnoDB 是一个事务型的存储引擎,有行级锁定和外键约束。
适用场景:
经常更新的表,适合处理多重并发的更新请求。
支持事务。
可以从灾难中恢复(通过 bin-log 日志等)。
外键约束。只有他支持外键。
支持自动增加列属性 auto_increment。
数据结构:
Innodb 的索引文件本身就是数据文件,即 B +Tree 的数据域存储的就是实际的数据,这种索引就是聚集索引。这个索引的 key 就是数据表的主键,因此 InnoDB 表数据文件本身就是主索引。InnoDB 的辅助索引数据域存储的也是相应记录主键的值而不是地址,所以当以辅助索引查找时,会先根据辅助索引找到主键,再根据主键索引找到实际的数据。所以 Innodb 不建议使用过长的主键,否则会使辅助索引变得过大。建议使用自增的字段作为主键,这样 B +Tree 的每一个结点都会被顺序的填满,而不会频繁的分裂调整,会有效的提升插入数据的效率。
MyIsam
MyIASM 是 MySQL 默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当 INSERT(插入) 或 UPDATE(更新) 数据时即写操作需要锁定整个表,效率便会低一些。
适用场景:
不支持事务的设计,但是并不代表着有事务操作的项目不能用 MyIsam 存储引擎,可以在 service 层进行根据自己的业务需求进行相应的控制。
不支持外键的表设计。
查询速度很快,如果数据库 insert 和 update 的操作比较少的话比较适用。
对整表进行加锁。
MyISAM 极度强调快速读取操作。
MyIASM 中存储了表的行数,于是 SELECT COUNT(*) FROM TABLE 时只需要直接读取已经保存好的值而不需要进行全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么 MyIASM 也是很好的选择。
数据结构:
MyISAM 索引结构: MyISAM 索引用的 B + tree 来储存数据,MyISAM 索引的指针指向的是键值的地址,地址存储的是数据。B+Tree 的数据域存储的内容为实际数据的地址,也就是说它的索引和实际的数据是分开的,只不过是用索引指向了实际的数据,这种索引就是所谓的非聚集索引。
如今我们还会学习 < 数据结构 >< 算法 > 等课程, 会被其中的时间复杂度, 效率搞得晕头转向, 有时候很怀疑为了这一点效率有必要如此大费周章吗. 当然, 如今计算机运算速度能达到每秒万亿次,微机也可达每秒亿次以上, 但是当数据量一旦变大之后呢? 若是对几个 G 的数据查询该怎么办呢? 因此算法的优化在数据库中还是非常重要的.
… 该文档还在编写中 …
参考文档:
[计算机·吕凤萍](http://www.cpweb.gov.cn/kepu/jishu/jisuanjijishu/21141_2.html)