MySQL学习01
主要描述关于下列主题的内容
- MySQL的官方指南
- MySQL的分支、变种与替代
- MySQL的体系架构
- MySQL的逻辑层、连接层、服务层、存储引擎
- MySQL的目录文件
MySQL的官方指南
- 官网地址
https://dev.mysql.com/doc/refman/5.7/en/
https://dev.mysql.com/doc/mysql-errors/5.7/en/ - 关于MySQL的版本
MySQL的版本并不是越新越好,就像JDK一样,即使现在已经出到了JDK16,但是绝大部分用到的还是JDK8,因为迁移的成本太大,服务器追求的是稳定。
MySQL的分支、变种与替代
- Drizzle
是从MySQL的某个分支Fork出来的代码,但是因为目的不一样,进行了大量的重写,甚至连底层实现的语言都换了,现在和MySQL完全不兼容。 - MariaDB
和MySQL高度兼容,这个就是MySQL之父在Oracle收购了MySQL之后,离开Oracle公司设计的一款数据库。是MySQL的一个超集 - Percona Server
这款数据库也是兼容MySQL语法的,是高性能MySQL作者设计的一款数据库,有非常多的思想是超前的,逐步都会在MySQL中体现。 偏学术,强调规范。 - Postgre SQL
目标是打造一块高可用,在极端情况下数据也能正常的数据库。在高并发场景下,性能也不会急剧下降。是MySQL的一个替代品,在国内并不是非常热门。 - SQLite
物联网、手机等软件本地数据库,不需要和外界交互,是使用最多的数据库。
MySQL的体系架构
这个是官网的一个体系结构:
- 最上面的是连接层,各种各样的连接驱动
- 然后是服务层,服务层有向上的接口,有解析器,优化器,还有各种缓存
- MySQL的插件是可插拔形式的,只要实现了插件需要的接口,都是一个存储引擎
- 最底下是文件系统,因为到最后,所有的数据都是要落盘的
MySQL的连接层
因为创建和销毁线程需要消耗大量的资源,所以都会实现池化技术,复用线程。可以通过 show variables like “%max_connections%” 查看最大的连接数,默认的值是151.因为是IO密集型,所以尽量是CPU线程数的两倍。 尽可能的把最大连接数调小,反而可以提高性能。
Server层
Server层当查询来的时候,会首先去缓存中看,如果存在就直接把结果返回去。因为设计目的就是为了支持多个客户端并发执行,所以为了保证线程的安全,是需要进行加锁的。所以在5.7的版本,默认是关闭缓存。可以通过命令【show variables like “%query_cache_type%”】进行查看。 在MySQL8的版本中,因为缓存命中率的原因,直接移除了原本的缓存逻辑,只保留了存储引擎层面的缓存。
存储引擎
官方支持的存储引擎
-
InnoDB
支持事务的引擎,支持高并发 -
MyISAM
不支持事务,且因为是锁表,所以也不支持高并发 -
Archive
仅支持插入和查询操作,且压缩比非常高 -
Blackhole
写完日志后,会丢弃数据,并不会保存 -
CSV
同样是一行中有很多个字段,只是每个字段的分割是用逗号 -
Ferderated
本地不存储数据,全部存储到远程的服务器上 -
Memory
就是类似于hashMap的内存存储结构,内存的速度一定会比磁盘的速度要快很多,但是因为是需要并发安全,所以是对整个Memory进行加锁,所以性能会有所损耗。
总结:如果没有遇到InnoDB无法解决的问题,尽量使用InnoDB,这也是MySQL5.5以后默认的存储引擎
可以通过【show engines】命令查看当前数据库都有哪些存储引擎。
可以通过【show variables like “%default_storage_engine%”】命令查看默认的数据库存储引擎。
MySQL的目录文件
bin
这个目录下存放了一些脚本文件,和服务器操控有关,如:启用、停止,比较重要的几个文件:
- mysqld 这个主要是用来启用和停止服务的
- mysqld_safe 用这个启动的时候,如果服务宕机了,会自动拉起
- mysqld.server 底层调用的也是mysqld_safe
data
这里存放所有罗盘的数据,包括下面比较重要的部分
- 每个数据库以一个文件夹保存,每个文件夹内表,表由 frm 结构文件和ibd数据文件组成(以innodb举例)
- error_log 发生异常时候,保存日志的地方
- slow_query_log ,如果慢查询开关开启时,会记录超过阈值的慢SQL到这个文件里面
- query_log 这里面会保存所有的操作记录,保证正常的和异常的,包括用户的和系统的
- bin_log 这个文件主要是复制的时候会用到
include
MySQL源码存放的地方
lib
sdk工具类存放的地方
share
系统库存放的地方,可以看到有针对每个国家的一些处理
my.ini
这个是配置文件,可以配置字符集、存放地址、静态变量等数据,默认扫描的路径是
/etc/my.cnf —> /etc/mysql/my.cnf—>/usr/local/mysql/etc/my.cnf----> 安装目录/my.cnf ----> ~/.my.cnf
这个是以linux的路径举例,后面的配置文件会覆盖前面的配置文件,也可以通过入参来指定配置文件