MySQL基础知识

  • 对于数据库管理软件来说,各种语言通过各自提供的驱动程序来完成和数据库管理软件的交互;
  • 对于非程序员来说,提供了一些命令,这些命令可以通过调用编程API来完成数据管理的功能,这个就是Mysqlclient完成的功能;
  • 专门用于进行数据管理的软件就是DBMS,Data Base Management System;
    • 用户视图:就是用户在交互过程中,看到的文件;
    • 物理视图:数据实际存储的结构;
  • 数据的组织结构:
    • 层次型:一个节点只能够有一个子节点;
    • 网状型:每一个节点存在不止一个子节点;
    • 关系型:通过二维关系来定义数据和数据之间的关系;
    • 依据关系型设计的数据库管理软件,称为关系型数据库管理软件RDBMS[Relational Databases Management System],对于表和文件的对应关系,不一定是一一对应的;
  • 文件存储数据的缺点:
    • 数据冗余;
    • 数据的不一致性;
    • 数据访问困难;
    • 数据的孤立问题;
    • 数据的完整性问题;
    • 原子性问题;
    • 并发访问异常问题;
    • 安全性问题
  • 文件的三个层次:
    • 表示层:具体的文件,用于实际访问的文件;
    • 逻辑层:通过文件系统将文件解构为物理层的数据;
    • 物理层:保存元数据,以及真实数据的存储块;
  • ER 关系模型:
    • 实体-关系模型,通常使用来降低数据冗余的一种手段,将大量重复的数据使用某种方式进行示;
  • 对象关系模型:基于对象的关系模型
  • 半结构化数据模型:对于结构化的数据,要求数据的每一行都是相同的,但是对于半结构化数据,没有要求是相同的;

  • SQL:Structure Query Language :表示结构化查询语言,IBMSystem R:使用SQL语言进行交互,对于用户来说,不需要定义任何的数据结构,就可以实现执行的数据语言;

  • DML[Data Manapulate Lanaguage]:数据操纵语言,增删査改;
    • INSERT:插入
      • insert into tb_name(coli1,coli2,...) VALUES('string', num...),('string',num...),...;:插入数据;
      • replace into tb_name(coli1,coli2,..) values('string',num...),('string',num),...;:表示替换数据;
    • DELETE:删除
      • `</li></ul></li>
        <li>
        SELECT:查询
        <ul><li>
        select coli,coli from tb_name;</li></ul></li>
        <li>
        UPDATE:更新
        <ul><li>
        update tb_name set column=value where ;`:如果不指定条件,.所有的数据都可能发生更改;
  • DDL[Data Defination Language]:数据定义语言,RDB的对象:库,表,索引,视图,用户,存储过程,触发器,事件调度器,创建,删除,修改上面的这些对象;
    • CREATE:创建
      • create database [if not exists] db_name;:用于创建数据库;
      • create table tb_name(col1, col2,...);:用于创建表;
      • show tables from db_name:用于查看表的数据;
      • desc tb_name:用于查看表的定义结构;
    • DROP:删除
      • drop database db_name;:删除时,需要慎重,没有回收机制;
      • drop table if exists tb_name;:用于删除表;
    • ALTER:修改
      • alter tb_name
        • modify:用于修改某个字段,用于修改字段的属性;
        • change:改变字段名称;
        • add:用于添加一个字段;
        • drop:用于删除一个字段;
        • alter table student change course Course varchar(30) after name ;
  • DCL[Data Control Language]:数据控制语言,用于定义访问控制权限;
    • GRANT:授权
    • REVOKE:移除授权
  • 约束:
    • 域约束:数据类型约束
    • 外键约束:表示引用完整性约束;
    • 主键约束:某个字段能唯一的标识此字段所属的实体,并且不允许为空,主键不能够相同,一个表只能够存在一个主键,候选键:具有主键特征的键,当选定某一个之后,这个就是主键;
    • 唯一性约束:每一行的某字段都不允许出现相同值,但是可以为空,一个表可以存在多个唯一键;
    • 检查性约束:用于保证数据逻辑的合法性,Mysql对于检查性约束很有限;
  • 关系型数据库的层次:
    • 表示层: 表,也就是TABLE;
    • 逻辑层:存储引擎,用来解释物理层存储的数据文件;
    • 物理层:数据文件;
  • 选择:指定以某字段为搜索码,进行逻辑比较,筛选符合条件的行;
  • 投影:用于指定显示某些特定的列;
  • 数据的存储和查询过程:
    • 存储管理器:
      • 权限以及完整性管理器
      • 事物管理器:保证用户事务的完整性;
      • 文件管理器:管理物理层的多个文件,以及对应关系的管理;
      • 缓冲区管理器:用于将数据读入内存,用来管理缓冲空间;
    • 查询管理器:负责接收,理解用户的查询请求,并且将查询请求提交给存储管理器;
      • DML解释器:用于解释DML语句;
      • DDL解释器
      • DCL解释器
      • 查询执行引擎
  • MySQL为每一个用户连接生成一个线程,MySQL是单进程多线程模型,
    • 守护类型:用于完成将内存缓冲区里面的数据写入磁盘的过程;
    • 应用线程:用于处理用户请求,用户请求触发,处理完毕回收;
  • 线程重用(Thread ruese)技术
  • Mysql对于SMP对称多处理器的支持不是很完善,MySQL不支持一条语句在多个CPU上面执行;
  • 常见的关系运算
    • 投影:只选择某些字段(属性)进行显示的;
    • 选择:只输出符合条件的行,WHERE;
    • 自然连接:具有相同名字的所有属性上取值相同的行,user.shellid=shell.shellid;
    • 笛卡尔积:(a+b)(c+d)=ac+ad+bc+bd,这种查询影响速率,需要尽量避免这种查询;
    • 并集:用于合并某些表的某些项目,称为集合运算;
  • MySQL服务器的体系结构
  • SQL语言的组成部分
  • 称为结构化查询语言,是一个工业标准,用于统一各个不同的关系型数据库软件标准;
  • 完整性定义语言:DDL语言的一部分
  • 视图定义
  • 事物控制语言
  • 嵌入式SQL和动态SQL
  • 授权:DCL
  • 实用程序语言如何和RDBMS进行交互

    • 嵌入式SQL:与动态SQL类似,但其语言必须在程序编译时完全确定下来;
    • 动态SQL:程序设计语言使用函数(mysql_connect())或者方法与RDBMS服务器建立连接,并且进行交互,通过建立连接向SQL服务器发送查询语句,并且将结果保存在变量中进行处理;
  • MySQL的组成部分

  • 连接管理器:用于接收并且处理用户的请求
  • 解析器:用于分析语法或者词法分析,用于将语句生成不同的执行树
  • 缓存器:如果存在缓存就是用缓存器里面的内容
  • 优化器:完成最优的生成树的语句(逻辑)重写等,用于提高语句重写;
  • 存储引擎:用于实现数据物理层和表示层的优化
    这里写图片描述
  • MySQL支持插件式存储引擎,不同的存储引擎支持不同的特性,MySQL 5.5.8支持MyISAM不支持事物机制,INNODB支持事物,适合于在线事务处理系统;
  • 连接管理器细化
    这里写图片描述
  • 各个模块的作用:
  • 连接管理器:用于侦听来自于Client的连接,然后将请求派发给线程管理器;
  • 线程管理器:用于跟踪用户请求,确保每一个用户都可以得到线程处理请求,并且需要完成线程的自我管理;
  • 用户模块:用来验证用户身份,用户的帐号,密码,主机等权限的认证;
  • 访问控制模块:用来验证用户的操作是否具有真正的权限来执行这些操作;
  • 解析器:用来解析查询,并且生成解析树,解析完成之后,将请求交给特定的模块来完成;
  • 命令分发模块:用于判断这个命令是否需要执行,以及是否需要记录日志;
  • 优化器:负责创建响应请求的最佳查询策略,用于在执行过程中,优化执行树的逻辑;
  • 表管理器模块:用于将表的执行请求,转换成对应的文件的,负责创建读取或者修改表定义文件;表的字段名称;
    • 对于表结构是需要特殊的文件来进行保存的,表结构定义文件用于保存每一张表的结构;
    • 维护表描述符高速缓存(用于将表的结构信息缓存在内存中);
    • 表锁:对表施加锁等操作;
  • 表修改模块:表创建,删除,重命名,移除,更新或者插入之类的操作;
  • 表维护模块:检查,修改,备份,恢复,优化(碎片整理)以及解析;

  • 数据在磁盘上面的存储:

    • 数据在磁盘块的基础上面引入数据块的概念,数据块是存储引擎进行管理的,定长行管理简单 ,但是会导致资源的浪费,变长行需要维护块头信息,用来描述变长行的使用情况,提高数据块的利用率,定长的查询效率会比较高;
  • 文件中记录组织;
    • 堆文件组织:一条记录可以放在文件中的任何位置;
    • 顺序文件组织:根据搜索码值(某个字段)顺序排序进行存放,通过引入指针的思想,保存下一条记录的指针值,在数据进行存储的时候,通过修改指针的值,来完成数据逻辑上面的顺序存储
    • 散列文件组织:通过散列运算,将散列的结果放在某一个范围的文件里面,用于加速查找过程,散列函数需要尽最大可能的使数据均匀的分布在各个桶里面;
  • 通常情况下,张表存储为一个单独的文件,但是对于某些存储引擎,将多个表存储在一个文件当中;
  • 表结构定义文件:
  • 表数据文件:
  • 表空间是用于实现将多个表的数据组织在一个数据文件中的一个逻辑管理组件;
  • 数据字典;
    • Data Directionary:表示各种数据的元数据,通常包括:关系的名字,字段名称,字段的域,字段的类型和长度,视图,完整性约束,用户,授权,密码;
  • 缓冲区管理器:缓冲区管理器需要提供缓存置换策略,来解决缓存中遇到的问题,内存空间过于小,降低置换率等问题,以及某些块是不能够被置换出去的,类似于文件系统存储过程中,文件名称等数据的存储,Mysql是通过数据字典来存储这些数据的;

  • MySQL

    • Mysql:高性能,查询性能可以和Oracla一较高下,稳定性,伸缩能力,完全的多用户支持,支持众多的开发语言,并且是开源软件;
  • 历史版本:
    • 4.0 :支持联合查询;
    • 4.1:支持子查询[嵌套查询],预备语句,引入B_tree索引和R_tree索引
    • 5.0:支持存储过程,支持游标,视图,触发器,分布式事务;
    • 5.1:支持数据分区,基于行的复制功能,支持插件式存储引擎的抽象层,事件调度器;
    • 5.5:在性能上面有了很大的性能改进;
    • 5.6:引入多线程复制等功能;
  • MySQL的产品家族:
    • MySQL Server:包含mysql以及mysqld;
    • MySQL Cluster:集群套件,至少需要四个节点,组合成一个基本的集群,4个9的可用性,可以在内存中处理数据,性能优异,但是比较少使用;
    • MySQL Proxy:代理服务器,可以实现MySQL的语句路由功能,用于实现读写分离,对于应用层代理,可以分析并且重写用户的请求报文,但是没有进行完整的使测试;
    • MySQL Adminitrator::MySQL的管理工具,可视化GUI管理工具;
    • MySQL Query Browser:查询浏览器;
    • MySQL WorkBench:数据库设计工具;
    • MySQL Migration Tookit:用于实现数据库之间的移植操作,用于在不同的版本和平台之移植数据;
    • MySQL Embedded Server:嵌入式环境专用的;
    • MySQL Drivers and Connector:专用的驱动和连接器;
  • mysql分为社区版本以及企业版本,一般来说使用社区版本可以满足实际中的生产需要;
  • MariaDB:
  • Percona:MySQL的性能改进优化的文章,建议关注;
  • MySQL的安装
  • 专用的软件包安装进行安装
  • 通用二进制格式,某个通用平台上面进行安装gcc icc;
  • 源代码软件包:
    • 5.5之后使用cmkae(CrossPlarform跨平台的意思,不是C语言的意思);
    • 下载安装社区版本;
      • GA:General Avaliability;
      • RC:Release Candidate;
      • beta:公测版本;
      • apha:内测版本;
  • MySQL提供的数据包
  • MySQL-client:Client工具用于提供命令行工具以及各种组件;
  • MySQL-debuginfo:用于调试追踪代码执行,高级DBA可能会是使用;
  • MySQL-Devel:表示开发用的头文件和库文件;
  • MySQL-embedded:嵌入式Server;
  • MySQL-server:表示服务器端
  • MySQL-shared:表示MySQL共享库;
  • MySQL-shared-compat:用于兼容老版本提供的兼容库;
  • MySQL-test:测试组件;
  • MySQL-VERSION-PALTFORM.src.rpm:源码格式的软件包;
  • MySQL安装后生成的文件
  • bin:MySQL的各种二进制程序,包括服务器端以及Client端;
  • data:数据和索引文件目录;
  • include:表示头文件;
  • lib:库文件;
  • man:帮助手册;
  • mysql-test:测试组件;
  • scripts:表示初始化脚本;
  • shared:将各种不同的错误信息本地化;
  • sql-bench:表示基准性能测试;
  • support-files:表示主配置文件的脚本,以及配置文件的样例;
  • 初始化配置
  • 配置文件的读取顺序:
    • /etc/my.cnf --> /etc/mysql/my.cnf --> MySQL-HOME/my.cnf --> /path/to/file when defaults-extra-file=/path/to/file is specified --> ~/.my.cnf;
    • 每一个工作在不同端口上面的mysql服务称为一个MySQL实例;
    • 在检查得到某一个位置得到配置文件之后,仍然会检查后面的配置文件的,如果配置文件在多个位置都找到,最终的结果是这些配置文件合并起来的结果,如果这些配置文件里面的内容是冲突的,那么冲突或者是重复的内容以最后一次读取的为准;
  • MySQL 安装完成以后生成5个用户,三个root用户:root@localhost root@172.0.0.1 root@hostname以及两个匿名用户' '@localhost ' '@hostname;
  • MySQL更改用户密码的方式:
  • 1.# mysqladmin -u root password 'new-password' -p;
  • 2.# mysqladmin -u root -h this_host_name password 'new-password';
  • 3.mysql> SET PASSWORD FOR 'USERNAME'@'HOST'=PASSWORD('new_pass');
  • 4.mysql> UPDATE mysql.user SET PASSOWRD=PASSWORD('new_pass') WHERE 'CONDITION';
  • mysql> FLUSH PRIVILREAGS;
  • mysql的几个几个常用选项:
    • -u USERNAME:用于指定用户名;
    • -h HOST:表示允许登陆的主机;
    • -P 'password':用于指定输入的密码;
    • --protocol {tcp|socket|pipe|memory}:表示连接的协议,远程连接是基于TCP的,如果是server在本机,Linux使用的是socket的机制来进行连接的,如果是windows那么使用的是memory的方式来进行连接的;
    • --port '':表示服务器软件的端口;
    • --database:用于指定链接默认的数据库;
  • 交互式模式
  • 客户端命令:
    • \?:表示用于获取帮助;
    • \c:提前终止命令执行,命令之前不能有;结束符;
    • \r:用于重新连接至 mysql 服务器;
    • \g:无论语句的结束符是什么,直接将此语句送至server端进行执行;
    • \G:无论语句的结束符是什么,直接将此语句送至 server 端进行执行,而且结果按照竖排进行显示;
    • \!:表示不用退出,直接执行shell命令;
    • \W:如果语句结束后,有警告信息则显示;
    • \w:如果有警告信息,不进行显示;
  • mysql 提示符:
    • mysql>:表示可以输出新的语句;
    • ->:表示等待数据输入结束;
    • '>:表示输入的单引号只有一段,还缺少后一段;
    • ">:表示输入的双引号只有一段,缺少后一段;
    • /*>:表示缺多行注释的后一半;
    • `>:表示反引号只有一段;
    • \#:对于新建的对象使用命令补全选项;如果对所有对象支持补全功能,
    • mysql> use mysql && rehash:就可以进行命令补全了;
    • -html:mysq --html | -H:用于文本输出为html格式;
    • -xml:支持输出为xml格式;
  • server 端命令:
    • Mysqladmin create hellodb: 用于创建一个新的表格;同样的还可以使用drop
    • Mysqladmin ping:用于查看链接的服务器是否在线;
    • Mysqladmin processlist:用于列出所有的进程列表;
    • Mysqladmin status:用于显示·mysql 的状态;可以使用--sleep选项,用于指定多久显示一次;--count:表示显示多少次;
    • Mysqladmin extend-statsu:用于显示扩展的状态,用于显示状态变量;
    • mysqladmin varibles:用于显示服务器的状态变量;
    • mysqladmin flush-privileges:表示让服务器重读授权表;等同于reload;
    • mysqladmin flush-tables:关闭所有的已经打开的表;
    • mysqladmin flush-threads:表示重置线程池;
    • mysqladmin flush-status:表示重置大多数的server状态变量;
    • mysqladmin flush-logs:表示进行日志滚动,主要进行二进制和中继日志滚动;
    • mysqladmin flush-hosts:表示当某个用户多次登录后,会被server判断为恶意禁止登陆,使用这个选项来刷新计数器,允许重新进行尝试;
    • mysqladmin refresh:表示同时执行flush-hostsflush-logs;
    • mysqladmin shutdown:表示直接停止mysql服务器;
    • mysqladmin version:用于显示mysql的版本的;
    • mysqladmin start-slave:表示启动从服务器;
    • mysqladmin stop-slave:表示停止从服务器的复制线程:应该有两个线程;SQL threadIQ thread;
  • Mysql 服务器启动过程中的几个错误:
    • 如果Mysql无法启动,首先使用命令killall杀死所有的Mysql相关的进程和线程,在数据目录的文件里面会有一个hostname.err 的文件;
    • 常见的原因包括:
      • 1.此项服务以前没有关闭;
      • 2.数据初始化失败;
      • 3.数据目录位置错误;
      • 4.数据目录权限问题;
  • 批处理模式
  • 添加一个脚本,在mysql>mysql> \./root/test.sql用来执行交互式脚本,也可以使用mysql < test.sql来执行;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值