目录
1、数据库 和 数据库实例的区别
数据库是一系列文件的集合,是静止的。而数据库实例是运行起来的进程,是动态的,通过运行起来的数据库实例去操作数据库。MySQL数据库实例是单进程的(包含多线程),一般一个实例对应一个数据库,但是对于集群或者分布式,可能多个实例对应于一个数据库。
2、启动数据库
安装好MySQL后,启动数据库:./mysql &
& 作为命令参数,表示将MySQL作为后台进程,即便我们关闭了命令行窗口,数据库依然是运行的。
查看MySQL进程信息:ps -ef | grep mysql
ps -ef 是一个命令,表示按照一定格式输出所有进程的信息;| 表示管道符,作用是将左边命令的输出作为右边命令的输入; grep mysql也是一个命令,表示在输入的内容中搜索带有mysql信息的内容,此处就是搜索所有进程信息中包含 mysql 字符串的进程信息。
启动的过程:mysql的启动会根据数据库配置文件里的参数来初始化,linux系统版本的mysql的配置文件一般my.cnf,但是windows版本mysql的配置文件时my.ini,如果数据库文件丢失,也可以启动,因为在mysql软件的代码里面本身就设置了默认配置参数,所以也能启动成功。
要注意,更改配置文件里的参数,效果是永久性的,在每次启动数据库时都有效。而在数据库运行期间,通过set指令设置的系统参数是临时的,只要系统重启,这些参数就失效了(因为要按照配置文件里的参数来)。
3、存储引擎
什么是存储引擎?比如执行一条sql语句,只需要我们输入sql指令即可,但是具体怎么执行的呢,具体对数据库的操作与执行就是存储引擎做的事情了,MySQL拥有多种存储引擎,InnoDB、MyISAM、Memory等等,没种存储引擎都有自己的特性、优势和支持的服务,所以,了解几个存储引擎是有必要的,在针对特定的开发需求时,可以选择一个合适的存储引擎。
MySQL是开源的,定义了存储引擎的接口,但是具体的实现可以由我们自己去做(自定义存储引擎)。
由于InnoDB的功能非常棒,因此,它是MySQL的默认存储引擎。
3.1、InnoDB引擎
1、支持事务,支持全文索引。
2、每张表必须有主键,如果用户没有定义主键,InnoDB自动生成一个6字节的ROWID字段作为主键,每张表的记录都是按照主键顺序进行存储的。
3、支持外键,有行锁设计(写数据的时候,要对该行记录加锁,避免数据出错,但是读取数据的时候,不会加锁)。
4、高并发性,提供4种标准的隔离级别。
5、提供插入缓冲,二次写,自适应哈希索引,预读等高性能功能。
3.2、MyISAM引擎
1、支持全文索引(不支持事务)。
2、数据文件和索引文件是2种不同类型的文件,可以使用myisampack工具对数据文件进行压缩和解压。
3、MyISAM默认支持一张表的最大存储为256TB。
4、MyISAM的缓存(内存)只用于存储索引文件(支持大于4G的缓存大小),数据文件如果需要被缓存的话,交给操作系统完成。
3.3、NDB引擎
1、它是一个针对集群的存储引擎。
2、将全部数据存放在内存中,也可以只将主键数据放在内存中,因此主键查询速度非常快。
3、每台机器的内存有限,那么可以通过添加NDB存储节点来线性提高数据库性能。
感觉和redis很像哦~,在此保留一个疑问。
3.4、Memory引擎
1、将数据全部存放在内存中,如果断电或者系统崩溃,数据将消失。
2、默认使用哈希索引。
3、只支持表锁,并发性差(表锁是以表为单位)。
4、不支持TEXT 和 BLOB 类型。
5、如果Memory引擎表的容量无法存储查询的结果集,或者结果集中有TEXT、BLOB类型,会将其转换为MyISAM表存放到磁盘中,磁盘的读取速度慢,这样会影响性能。
感觉这个更像redis了。
3.5、Archive引擎
1、只支持插入 和 查询操作。
2、存储数据时会进行压缩,压缩比可达 1 :10。
3、适合存储归档数据,支持行锁,高并发。
4、不是事务安全的。
3.6、Federated引擎
1、不存储数据,只是指向一台远程MySQL数据库服务器上的表。
3.7、Maria引擎
1、支持缓存 数据文件 和 索引文件。
2、支持行锁。
3、支持事务。
是MyISAM引擎的升级版本。
3.8、各种引擎的比较
每种引擎都各有特点,所以每种引擎的表格的类型是不同的,所以才常常说什么引擎表,比如InnoDB引擎表,只是我们在开发的时候,呈现给我看的就是一张包含业务数据的关系表而已。比如在不同的引擎下,同样创建一张空表,这些表所占的空间大小都是不一样的,因为这些表还包含了不同的特有属性。
3.9、查看引擎
1、使用命令:SHOW ENGINS; //顺便说一下,应该遵守规范,sql 的关键字要用全大写
2、当我们安装了MySQL数据库后,会自带几个系统方面的数据库,比如information_schema,mysql,sys等等,这些数据库存储的是整个MySQL的非业务数据(系统级别的数据)。在information_schema里面有个ENGINS表,表里存储着引擎的信息:
4、连接数据库
一种是MySQL本身提供的(连接,操作)程序,这种是本地的,就是我们用命令行的形式去操作MySQL。另一种是远程连接,需要在用户端有一个远程连接进程,这个连接进程会与MySQL数据库进程进程连接通信,以达到对数据库的操作。进程间的通信方法有匿名管道,命名管道,TCP等等。
远程连接一般是基于TCP的,连接命令:mysql - h IP地址 -u 用户名 -p 。
本地连接一般用管道或者共享内存方式通信。
5、数据库的体系结构
如下图,我用的 java 编程语言,所以 java 版的数据库操作规范是 JDBC,JDBC定义一系列操作数据库的标准接口,比如像数据库插入一条数据用什么方法,删除一条数据用什么方法。但是这些接口的具体实现是用的什么呢?用的是数据库驱动程序,实现了接口,建立了与数据库的连接,将 java 语言版的数据库操作信息转换为MySQL能够识别的SQL语言,是真正与数据库通信交互的角色。关于数据库连接,可以使用第三方的数据库连接池。然后通过连接将SQL发送给数据库,数据库进行语义识别,调用与SQL请求相关的数据库接口去完成SQL任务,而数据库接口的实现是存储引擎,所以具体的执行还是得存储引擎去做(比如查询,插入等等)。最后存储引擎操作的对象就是数据库文件系统(就是我们理解的数据库表)。