首页 文章详情

天天用MySQL,可这些你懂吗?

Java技术迷 | 204 2021-07-08 15:40 0 0 0
UniSMS (合一短信)

立体的萌 | 作者

Java技术迷 | 出品

前言

MySQL的应用实在是太广泛了,因为他几乎可以在任何的操作系统上面运行,MySQL的移植性也是几个主流数据库中比较好的,可能在不同的操作系统的底层实现上各有不同,MySQL可以保证不同平台的物理体系结构的一致性;

一开始,MySQL还没有火,更没有今天这么强,他一开始被研发出来的时候只是个小型的关系数据库,一步一步发展到今天成为了各大企业的核心是数据库;

注意,数据库是数据库,实例是实例

数据库的定义是按照一定的数据模型能够永久的存储在计算机中的可共享的数据集合,数据库的文件可以是frm、mdy、myi、ibd结尾的文件;

数据库实例是由数据库后台进程或者是线程以及一个共享内存区组成的,共享内存可以被运行的后台线程或者是后台进程所共享,真正操作数据库文件的就是数据库实例!

这两者的对应关系是一对一的关系,也就是说一个数据库对应着一个数据库实例同时一个数据库实例也对应着一个数据库,不过,集群的情况下可能会存在一个数据库被多个实例使用的情况;

MySQL数据库是一种单进程多线程的架构的数据库,那么这也就是说,一个MySQL数据库实例在系统上的表现就是一个进程;

黑客即时感:用命令启动

以Linux为例启动MySQL数据库实例:

[root@xen-sever bin]# ./mysql_safe &
[root#xen-sever bin]# ps -ef | grep mysqld
 root  3441 3258 0 09:10 pts/3 00:00:00
/bin/sh ./mysqld_safe
mysql 3578 3441 0 09:10 pts/3 00:00:00
/user/local/mysql/libexec/mysqld --basedir=/usr/local/mysql
--datadir=/usr/local/mysql/var --user=mysql
--log-error=/usr/local/myssql/var/xen-sever.err
--pid-file=/usr/local/mysql/var/xen-sever.pid
--socket=/tmp/mysql.sock --port=3306
 root 3616 3258 0 09:10 pts/3 00:00:00 grey mysqld

进程号为3578的实例就是MySQL的实例,在这里我使用了mysqld_safe 命令来启动数据库,启动实例的时候,MySQL数据库会读取配置文件并根据配置文件的参数来启动数据库实例,如果没有配置文件,MySQL会按照编译时的默认参数设置启动实例,用这个命令可以查看:

[root@xen-server bin]# ./mysql --help | grey my.cnf
order  of  preference,my.cnf,$MYSQL_TCP_PORT
/etc/my.cnf. /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

MySQL是按照这样的顺序来读取文件的:/etc/my.cnf到/etc/mysql/my.cnf到/usr/local/mysql/etc/my.cnf 到~/.my.cnf;

那么,问题来了,如果几个配置文件都有同一个参数MySQL该以哪个配置文件为准?MySQL的规则是以读取到最后一个配置文件中的参数为准;

MySQL,我们终于赤诚相见了

就如同java既可以是java语言,又是java平台一样,MySQL既是数据库又是数据库实例,一个是一种数据的集合,一个是应用程序,数据库实例有多重要?别急,很快你就明白了它的重要性了;

数据库实例是位于用户与操作系统之间的一层数据管理软件,用户对数据库的任何操作,也就是数据库定义、数据查询、数据维护、数据库运行控制等(耳熟吧!),都是在数据库实例下进行的!!!而且,应用程序也只能通过数据库实例才能和数据打交道!

这是MySQL的体系结构:

MySQL的组成部分有:

  1. 连接池组件

  2. 管理服务和工具组件

  3. SQL接口组件

  4. 查询分析器组件

  5. 优化器组件

  6. 缓冲组件

  7. 插件式存储引擎

  8. 物理文件

MySQL区别于其他数据库也是他的最大优势就是:插件式的表存储引擎;

存储引擎是个好东西

存储引擎的好处就是:每个存储引擎都有各自的特点,能够根据具体的应用建立不同的存储引擎表,MySQL不是开源的吗(不过ORACLE收购了SUN之后就是半开源的了,之前SUN收购了MySQL),你可以根据MySQL预定义的存储引擎接口来编写自己存储引擎,当然了,这纯属个人爱好了,MySQL提供的存储引擎已经能够满足大部分应用的需求;

MySQL的存储引擎分为:MySQL官方引擎和第三方存储引擎;

有些第三方存储引擎非常强大,比如说大名鼎鼎的InnoDB(他也被ORACLE收购了);

来认识下InnoDB

InnoDB主要是面向在线事务处理(OLTP)方面的应用,主要的特点是:行锁设计、支持外键、非锁定读(默认情况相爱读操作不会产生锁)等,Windows系统默认就是InnoDB;

InnoDB把数据放到一个逻辑的表空间,这个表空间可以把每个InnoDB的表单独放到一个独立的ibd文件中,InnoDB还可以用row disk(裸设备)来建立其表空间;

InnoDB的高并发性是通过多版本并发控制(MVCC)来实现的,他还有插入缓冲、二次写、自适应哈希索引、预读等功能;

对于表中数据的存储,InnoDB采取聚集的方式,每张表的存储都按照主键的顺序存放,InnoDB会为每一行生成一个6字节的ROWID并以此为主键;

那其他的存储引擎呢?

第一个:MyISAM存储引擎

这是MySQL官方提供的,不支持事务、表锁和全文索引,对于一些OLAP操作速度快;

MyISAM由MYD和MYI组成,前者用来存放数据文件,后者用来存放索引文件;

在MySQL5.0之前,MyISAM默认支持的表大小就是4G,如果需要支持大于4G的表就要制定MAX_ROWS和AVG_ROW_LENGTH属性,从MySQL5.0以后就默认支持256T的单表数据了;

第二个:NDB存储引擎;

这是MySQL AB公司与2003年收购的。NDB是一个集群存储引擎,他的特点是把索引数据全部放到内存中,非索引数据放到磁盘上,所以主键查找的速度很快;

第三个:Memory存储引擎;

之前叫HEAP存储引擎的,由于他是吧数据都存放到内存中所有一但系统崩溃啥的数据全没了,它的长处在于临时存储;

第四个:Archive存储引擎;

Archive引擎只支持INSERT、SELECT操作、索引等;

第五个:Federated存储引擎;

Federated并不存放数据,而是指向一台远程MySQL数据库服务器上的表;

其实存储引擎还有很多很多种,不过有的比较弱鸡,甚至有的连事务都不支持(真不知道设计者咋想的,没有事务跟文件有啥区别啊?)比较能耐的就是这几个;

关于连接的一些问题

在Windows系统中如果两个需要通信的进程,在同一台服务器上,那么就可以使用命名管道,在配置文件中启用--enable-named-pipe选项,MySQL还提供了共享内存的方式,在配置文件中添加--shared-memory,同时在连接时MySQL客户端要使用-protocol=memory选项;

此外,在UNIX或者是Linux环境下还可以使用Unix域套接字;

先查找到Unix套接字:

mysql> show vairables like 'Socket';
Variable_name;socket
  Value:/tmp/mysql.sock
1 row in set (0.00 sec)

知道了Unix套接字的路径之后就可以连接了:

[root@stargazer ~]# mysql -udavid -s /tmp/mysql.sock
welcome to the MySQL monitor.Commands end With;or .\g
Your MySQL connection id is 20333
Server version:5.0.77-log MySQL Community Server(GPL)
Type 'help';or '\h' for help.Type '\c' to clear the buffer 

mysql>

总结

MySQL并不是我接触的第一个数据库,但是确实我喜欢的一个数据库,当我了解它的插入式存储引擎之后我有一种相见恨晚的感觉,这么好的东西怎么没有早一点了解到呢?

本文作者:立体的萌 为Java技术迷专栏作者 投稿,未经允许请勿转载。

点击下方公众号

回复关键字【电子书】领取资料

1、真香!用IDEA神器看源码,效率真高!
2、什么?Spring Boot CommandLineRunner 有坑!?
3、顶级分布式开源项目,配上这款可视化工具,真香!
4、都知道Tomcat是个Servlet容器,可是Servlet又是怎么回事?
5、这年头,还有不会OOM排查神器mat的程序员么?
6、Java程序员必会的工具库,让你的代码量减少90%
7、重装IDEA再也不愁了,一招搞定同步个人配置了!

点分享

点收藏

点点赞

点在看

good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter