如果有独特 潜水
  • 1发帖数
  • 1主题数
  • 0关注数
  • 0粉丝
开启左侧

深挖MySQL——MySQL初探

[复制链接]
如果有独特 发表于 2021-9-12 16:23:00 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
隔了好几年没有写博客了,突然又想动笔写点什么。从事开辟这几年从没停下过自学的脚步,但所谓一入软件深似海,随着看的东西越多越是不敢下笔。总是觉得自己的理解差了点什么,就像每次翻过同一本书,每次都能看到不少之前理解的偏差,总是怕写的东西贻笑大方。不过转念想,好歹努力过,学习过,总还是留下点痕迹,如果有幸有一二位读者看到我的文章,能对自己有一些资助,那也还算有些意义了。言而总之,话不多说,来分享下这些年对MySQL的学习和理解吧。


一、MySQL的历史配景


信赖大部分人对此也没什么兴趣,不想浪费时间直接跳过本段也无伤大雅,不过是知道了如今完善的功能也非一就而成,集腋成裘,聚沙成塔。对于MySQL的历史配景我也相识不多,无非就是从1995年第一个版本发布后慢慢的发展至今,不过有几个我觉得是里程碑式的节点可以相识一下:


1、innodb问世:InnoDB引擎由InnobaseOy公司开辟,后续为oracle公司收购,innodb问世后,MySQL总算对事务有了较好的支持。为后续与其它关系型数据库竞争做好铺垫。此时的innodb只支持ACID、行锁设计、MVCC多版本并发控制(对于MVCC、存储引擎和MySQL的关系,后续会展开介绍。ACID不知道是什么?好好复习下事务的四大特性去)


2、MySQL5.1版本发布:2001年开始,Innobase公司开始与MySQL AB公司举行合作并开源InnoDB存储引擎的代码,oracle于2008年收购了Innobase,同年发布了InnoDB Plugin,大概称为innodb 1.0.x,在原有基础上,增长了compress和dynamic页格式(旧版页格式只有compact和redundant。mysql的数据、索引等以页的情势存储在磁盘和缓存在内存里面,此事说来话长,后续再介绍也无妨)


3、MySQL5.5版本发布:此时innodb升级到了1.1.x版本,增长了Linux AIO和多段回滚


4、MySQL5.5.8版本的发布:从这个版本开始,MySQL将之前的myisam默认存储引擎改成了默认使用oracle公司收购来的、我们最熟悉的innodb存储引擎,从此,MySQL的OLTP应用时代来临(OLTP on-line transaction processing,字面意思,侧重事务,myisam是OLAP应用,On-Line Analytical Processing,没有事务,方向查询,统计,分析)


5、MySQL5.6版本发布:5.6之后的版本也是我们现在比力熟悉的数据库版本了,此时的innodb升级到了1.2.x,增长全文索引和在线索引添加(值得一提的是,以前我一直以为实现在线索引添加是很简单的小事)


二、MySQL数据库和存储引擎


这里着重提一下我也一度肴杂的几个概念:


数据库:数据库指的是一系列文件的聚集:在MySQL里的frm文件、ibdata文件、ibd文件等


数据库实例:由后台线程以及一个共享内存区组成,在系统上的表现就是一个进程,我们(使用者)通过数据库实例这个进程来操作数据库文件


平时我们常常将数据库和实例肴杂,其实也没什么问题,反正双方能正确的互换表达就没有问题。至于“存储引擎”这个概念,为MySQL独有(实际上我也不知道有没有别的数据库有这东西,反正oracle和sql server没有)。存储引擎的上风就是MySQL可以通过不同的存储引擎,创建不同的存储引擎表,而不同的存储引擎有着各自的特性。在此,让我们打一下比方(比方同砚,无意冒犯):


innodb:MySQL的OLTP应用中,应用的最广泛的存储引擎,支持行锁、外键、独立的表空间ibd文件、MVCC、sql标准的4个事务隔离级别等(最早是第三方引擎,后被收购;这阐明什么?阐明这种开源的东西你也有机遇写一个,然后被收购,然后大名鼎鼎)


myisam:MySQL5.5.8前的默认存储引擎,不支持事务,支持全文索引,且缓冲池只缓存索引文件,不缓存数据文件


maria:可以看作myisam的升级版,对比myisam多了行锁、MVCC、支持缓存数据文件等


ndb、memory:把这两个放在一起是因为这俩的数据都是放在内存的,速度非常快,但是不安全,没怎么用过不多介绍,想具体深入相识的自行解决了


除了上述的各个存储引擎外,还有许多其它的存储引擎,它门各有特色,在自己的领域上发挥着各自的上风,不过大部分使用者比力熟悉的应该还是innodb(信赖大部分读者也根本上只会用上innodb),其它感兴趣的读者请自行相识了。下面,我画了一张图,大概展示MySQL的结构:



                               
登录/注册后可看大图

可以看到,MySQL是一个经典的插件式开辟案例,它提供了一系列标准和服务支持,底层的物理结构由存储引擎实现,存储引擎开辟者可自由的按自己意愿开辟(你还在等什么呢,大牛)。



三、MySQL数据库的相干文件


这里介绍一下比力常看到的文件,不太常看到的反正你也看不见。


1、参数文件


打开你的下令行,linux下输入mysql --help | grep my.,大概在windows下输入mysql --help | findstr my.,你大概就会看到好几个my.cnf和my.ini文件(cnf和ini都会有,ini是windows用的,cnf是linux用的),这就是MySQL的参数文件了,文件里出现相同的参数的时间,你的下令行输出的文件中,越往后优先级越高(就是说以后面的那个文件为准)。MySQL和oracle在参数文件上有一个区别,就是这些文件全删了也是不会影响MySQL实例的启动,这是因为MySQL编译的时间偷偷的把默认参数编译进去了。


对于MySQL的参数,在实例中可以使用下令show variables like 'xxxx'来查察。MySQL的参数作用域有三个级别:静态(永久)、动态(全局、会话)。所谓静态(永久),就是配置文件上的参数,此类参数必要重启生效。动态参数可以使用set [global|session] xxx = yyy来动态修改,顾名思义,全局global就是对所有会话都生效,session只对本会话生效。有的参数只能在会话中修改,如autocommit,有的修改了会在全局生效,如binlog_cache_size。参数繁多,等遇上了再相识不迟。


2、套接字文件


顾名思义,就是在使用套接字连接的时间用到的文件,一样平常在/tmp/mysql.sock


3、pid文件


一样平常在MySQL实例启动的时间,会将进程ID写入pid文件,一样平常在/数据库目次/主机名.pid


4、frm表结构定义文件


由于插件式存储引擎的关系,MySQL的数据存储是根据表举行的,不同的表使用的存储引擎可以不同。但是无论使用哪种存储引擎都是由frm文件来记录表的结构定义,同时,MySQL的视图也是使用frm文件记录


5、innodb引擎表空间文件


innodb的表空间分别为公告表空间“ibdata”和独立表空间“表名.ibd”(独立表空间有一个开关参数:innodb_file_per_table),公告表空间默认文件时ibdata1,可以通过innodb_data_file_path参数拆分成多个文件组成。独立表空间里面只存放表的数据、索引、插入缓冲位图等信息。


6、日记文件


之所以把日记文件放在大轴位(最后),一个是因为这个比力重要,一个是因为这个比力复杂,MySQL的日记文件有部分有独立的文件存放;还有一部分比如回滚日记undo log,是记录在公共表空间的;还有记录在数据表里面,比如慢查询日记记录在mysql.slow_log。下面简单列一下MySQL的各类日记:


1> 错误日记,可以通过参数log_error查察错误日记的存放位置,当数据库不能正常启动/重启的时间,第一个必须查找的文件就是错误日记。并且,还能通不对误日记里的一些警告发现数据库优化的提示


2> 慢查询日记,默认情况下数据库是不启动慢查询日记记录的,必要将开关参数log_slow_queries设置成ON打开。参数long_query_time可以设置超过几秒的查询记录为慢查询,long_queries_not_using_indexes参数设置将没用到索引的查询也记录在慢查询日记


3> 查询日记,据说记录在主机名.log文件下,但是我并没有找到。不过不要紧,MySQL5.1版本后可以设置general_log参数让他记录在mysql.general_log表中


4> 二进制日记bin log,二进制日记记录的是所有对MySQL执行的更改操作(当然不包过select和show),记录机遇为事务提交后写入,二进制日记是不会删除的,所以可以通过它让数据库恢复到任意时间点的状态,此操作称为point-in-time。并且可以将重做日记用于复制操作:如搭建主从集群,可以通过二进制日记来实现主从数据同步。最后还能通过对二进制日记的审计来判定是否有对数据库的注入攻击


5> 上面枚举的都是MySQL的日记文件,下面说的两个是innodb独有的日记文件。重做日记redo log,默认记录在名为ib_logfile0和ib_logfile1文件组中。记录方式为每秒写入、循环写入:1写满了写2,2写满了写1,这里可以看出和二进制日记的区别,由于覆盖操作,这里是没有记录所有更改的,无法作point-in-time操作。可以通过innodb_mirrored_log_groups参数设置文件组的镜像,提高可用性。重做日记是保证事务原子性A和长期性I的重要保障(怎么保障后面篇章再介绍了,现在有这么一个概念就行),所以不能设置的太小,不然一个事务里必要往返的切换重做日记文件;重做日记也是数据库宕机后恢复事务的保障,所以此文件不能设置的太大,不然恢复的时间会必要很长的时间


6> 回滚日记undo log,回滚日记是保证事务一致性C的重要保障,undo log记录在表空间的undo段,undo段位于公共表空间。回滚的原理是作与之前相反的操作,比如对于delete,实际上它的删除是逻辑删除,数据保留在数据库中,回滚时innodb会执行相应的insert操作,重要的时undo log的产生会陪同redo日记的产生,这是对undo log长期性的保护。undo log另一个重要作用是对MVCC Multi-Version Concurrency Control多版本并发控制的实现


由于篇幅问题,信赖读者对重做日记和回滚日记的实现还是保有许多疑问,后续再单独开篇分享吧,这里有一个概念就差不多不影响后续阅读。


四、安装和连接


下载地址:https://dev.mysql.com/downloads/mysql/,下载和自己操作系统匹配的版本,安装过程信赖优秀的你知道该怎么点击下一步。


MySQL的连接方式有三种,最常用的是TCP/IP连接,一样平常像heidsql、navicat客户端也是用此协议连接,在linux下下令为:mysql -h 192.168.0.xxx -u root -p。另外两种连接方式分别为命名管道连接和uninx套接字连接,由于不太常用这里不再追述,想秀操作的你为何不问问神奇的海螺怎样操作呢。


如有错误,敬请斧正;欢迎转载,但请务必注明出处;最后,在此向神奇的海螺保证,绝不太监!!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

猜你喜欢
在线客服邮箱
wxcy#wkgb.net

邮箱地址#换为@

Powered by 创意电子 ©2018-现在 专注资源实战分享源码下载站联盟商城