1.MySQL体系结构和存储引擎

1. 数据库和实例

数据库:物理操作系统文件或其他形式文件类型的集合。

数据库以 frm MYD MYI 结尾的文件

.frm :表定义,描述表结构文件

.MYD: "D"数据信息文件,是表的数据文件

.MYI: "I"索引信息文件,是表数据文件中任何索引的数据树

实例:MySQL数据库由后台线程以及一个共享内存区组成。

实例的启动会在哪些地方找配置文件:

$ mysql --help |grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf

按照上面的顺序进行寻找,相同的配置以最后一个配置文件为准

注意点:

1)数据库实例才是真正操作数据库文件的。即一个数据库实例对应一个数据库,一个数据库对应一个数据库实例,但是在集群情况下,可能存在一个数据库对应多个数据库实例。

2)数据库实例在系统上的表现就是一个进程。MySQL是一个单进程多线程的应用。

2.MySQL体系结构

在这里插入图片描述

自上而下分别是:

  • 数据库驱动(JDBC)

  • 连接池组件

  • 管理服务和工具组件

  • SQL接口组件

  • 查询分析器组件

  • 优化器组件

  • 缓冲组件

  • 插件式存储引擎

  • 物理文件

3.MySQL存储引擎

3.1 InnoDB 存储引擎

  • MySQL5.6之后,成为默认存储引擎

  • 支持事务,设计目标是面向在线事务处理(OLTP)的应用。

  • 支持行锁,外键

  • 使用多版本并发控制(MVCC)来实现高并发性以及事物的隔离级别

  • 聚集(簇)索引:每张表的数据存储都是按照主键的顺序进行存放的,如果表创建时候没有指定主键,InnoDB会为每一行生成6字节的ROWID,作为主键.

  • 聚集索引:比较好的总结

聚簇索引和非聚簇索引:

https://blog.csdn.net/jiadajing267/article/details/54581262

简单来说,聚簇索引就是表记录的排列顺序和索引的排列顺序一致.

不是聚簇索引的就是非聚簇索引.

详细的之后再看.

叶子节点存储的数据:聚簇索引vs非聚簇索引

3.2 MyISAM 存储引擎

ETL介绍

ETL基础知识

  • 不支持事务
  • 表锁设计
  • 支持全文索引
  • 主要面向OLAP数据库应用
  • 缓存池只缓存索引文件,而不缓存数据文件,数据文件的缓存交由操作系统完成

3.3 NDB引擎

  • 集群存储引擎
  • 数据全部放在内存中(从MySQL5.1开始,将非索引数据放在磁盘上)
  • 问题:存储引擎的连接操作(JOIN)是在MySQL数据库层完成的,而不是在存储引擎层完成的.这意味着复杂的连接操作需要巨大的网络开销.

3.4 MyISAM 和 InnoDB 比较

MyISAMInnoDB
不支持事务支持事务
表锁行锁
不支持外键支持外键
类似堆表?索引组织表
.frm存储表结构,.MYD存放数据,.MYI存放索引.frm存储表结构,ibdata1共享表空间,.ibd多表存储
索引存放位置:.MYI索引和数据一起存放在表空间中
只缓存索引文件,数据文件的缓存由操作系统本身完成索引和数据一起保存在表空间里

堆表:

  • 没有聚集索引的表
  • 数据存储没有任何的顺序(导致查询慢?),插入数据也没顺序
  • 数据页之间没有衔接

3.5 小结

MySQL的存储引擎很多,不存在优劣性的差异,要在合适的场景下使用合适的引擎.

4. 连接MySQL

连接MySQL的操作是一个进程和数据库实例之间的通信,本质上是进程之间的通信.

连接数据库的方式:

  • TCP/IP
  • 命名管道和共享内存
  • UNIX域套接字

4.1 TCP/IP

远程访问首先要将远程的数据库权限打开:

use mysql;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
#最后刷新一个缓存
flush privileges;
#使用下面的命令可以连接远程服务器
#注:ubuntu->win(success),win->ubuntu(fail)
$ mysql -h192.168.137.1 -uroot -p****

在这里插入图片描述

win10连接阿里云服务器(ubuntu16.04)的MySQL
MySQL版本:(mysql --version)
mysql Ver 14.14 Distrib 5.7.30, for Linux (x86_64) using EditLine wrapper

参考链接:

​ https://www.cnblogs.com/xujishou/p/6306765.html

​ http://www.mamicode.com/info-detail-2213421.html

我遇到的坑:(只找到了替代方案,有大佬指导一下,具体问题在哪)

1)ubuntu 16.04 mysql的配置文件位置: /etc/mysql/mysql.conf.d/mysqld.cnf

2)上面设置完毕后,通过cmd窗口连接:

mysql -hIP地址 -u用户名 -p密码

然后报错:ERROR 1045 (28000): Access denied for user ‘root’@‘1*’ (using password: YES)

问题可能原因 :mysql.user表中有两个root用户,密码不一致?,暂时还不知道为什么

在这里插入图片描述

然后我新建一个用户:

CREATE USER ‘yuan’@’%’ IDENTIFIED BY ‘123’;

grant all on * . * to ‘yuan’@’%’;

成功连接,使用Navicat也成功连接.

4.2 命名管道和共享内存

  • 两个需要进程通信的进程在同一台服务器上,可以使用命名管道.

  • 进程之间的通信方式

  • 面试题:进程间通信的方式

    References:

    ​ https://www.jianshu.com/p/c1015f5ffa74

    进程间的通信方式:

    ​ 管道: 匿名管道和命名管道(FIFO)

    ​ 消息队列

    ​ 信号量

    ​ 共享内存

    ​ 套接字

4.3 UNIX 域套接字

  • 只能在MySQL客户端和数据库实例在同一台服务器上这种情况下使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL数据库体系结构是指MySQL数据库的整体架构和组成部分。MySQL数据库采用了客户端/服务器模式,由多个组件组成,包括以下几个主要部分: 1. 客户端:客户端是与MySQL数据库进行交互的用户应用程序或工具,可以通过命令行、图形界面或编程接口与数据库进行通信。 2. 连接器(Connector):连接器负责处理客户端与服务器之间的连接。当客户端请求连接时,连接器会进行身份验证,并建立与服务器的通信通道。 3. 查询缓存(Query Cache):查询缓存用于缓存查询结果,当相同的查询再次执行时,可以直接从缓存中获取结果,提高查询性能。但在MySQL 8.0版本后,查询缓存被废弃,因为其对于高并发环境下的性能影响较大。 4. 查询解析器(Query Parser):查询解析器负责解析SQL语句,将其转换为内部数据结构,以便后续的优化和执行。 5. 查询优化器(Query Optimizer):查询优化器负责对查询进行优化,选择最优的执行计划。它会根据表的索引、统计信息等因素来评估不同的执行计划,并选择成本最低的执行方式。 6. 存储引擎(Storage Engine):存储引擎负责数据的存储和检索。MySQL支持多种存储引擎,如InnoDB、MyISAM等。不同的存储引擎具有不同的特点和适用场景。 7. 日志模块(Logging):日志模块用于记录数据库的操作日志,包括事务日志、错误日志、慢查询日志等。日志对于数据库的恢复和故障排查非常重要。 8. 缓冲池(Buffer Pool):缓冲池用于缓存磁盘上的数据页,减少磁盘IO操作。当需要读取数据时,首先在缓冲池中查找,如果找到则直接返回,否则再从磁盘读取。 9. 磁盘存储(Disk Storage):MySQL数据库将数据持久化存储在磁盘上,使用文件系统来管理数据文件和日志文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值