Mysql数据库学习知识总结

数据库的基本概念:

数据:描述事物的符号记录为数据。

表:将不同的记录组织在一起,就形成了“表”,是用来存储具体数据的。

数据库:表的集合,是存储数据的仓库,以一定的组织方式存储的互相有关的数据。

数据库管理系统:实现对数据库资源有效组织、管理和存取的系统软件。具有数据库的建立和维护功能、数据定义功能、数据操纵功能、运行管理功能、通信功能。

数据库系统:是一个人-机系统,由硬件、操作系统、数据库、DBMS、应用软件和数据库用户组成。用户可以通过DBMS操作数据库,也可以通过应用程序操作数据库。

 

数据库的分类:

关系型数据库:最大的优点就是事务的一致性;缺点是读写性能比较差;

非关系型数据库:noSQL主要指那些非关系型的、分布式的,主要带有mongo

DB,redis;noSQL提出另一种理念,以键值来存储,且结构不稳定,每一个元组都可以有不一样的字段,这种就不会局限于固定的结构,可以减少一些时间和空间 的开销。使用这种方式,为了获取用户的不同信息,不需要像关系型数据库中,需要进行多表查询。仅仅需要根据key来取出对应的value值即可,所以避免了关系型数据库复杂的查询关系,可以大大增加查询的效率。

 

Mysql数据库的概述:

Mysql是一个关系型数据库管理系统,目前属于oracle旗下公司。是一个真正的多用户、多线程SQL数据库服务器。SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言。Mysql由一个服务器守护程序mysqld和很多不同的客户程序和库组成。SQL是一种标准化的语言,它使得存储、更新和存取信息更容易。

扫描二维码关注公众号,回复: 11509693 查看本文章

 

Mysql存储原理:

Mysql整体架构:

Connectors(连接器):第三方软件通过连接器可以连接到mysql;

Connection pool(连接池):最上层负责和客户端进行连接,在这一层有连接池的概念,类似于线程池,连接池可以同时处理很多个数据库请求。同时这一层有SSL的安全概念,可以确保连接是安全的。

SQL interface(SQL接口):负责发送和接受SQL语句的。这一层是封装层,将传递过来的SQL语句拆散,将底层的结果封装成SQL的数据格式。

Parser(解释器):这一层将SQL语句进行拆分,验证SQL语句格式是否正确,如果正确就继续向下执行,如果语句有问题那么就返回错误。

Optimizer(优化器):对SQL查询的结果优化处理,会产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返回结果。

Caches & buffers(缓存):对要查询的SQL语句进行hash后缓存,如果下一次是相同的查询语句,则在SQL接口之后直接返回结果。

Pluggable storage Engines(存储引擎):mysql有很多种存储引擎,每一种都有不同的特性,他们负责组织文件的存放形式、位置,访问文件的方法等。比较常用的有innoDB,mylSAM

File system(文件系统):真正存放物理文件的单位。

 Mysql查询过程:

首先程序的请求会通过mysql的connectors与其进行交互,请求到处后,会暂时存放在连接池(connection pool)中并由处理器(Management Serveices & Utilities)管理。当该请求从等待队列进入到处理队列,管理器会将该请求丢给SQL接口(SQL Interface)。SQL接口接收到请求后,它会将请求进行hash处理并与缓存中的结果进行对比,如果完全匹配则通过缓存直接返回处理结果;否则,需要完整的走一趟流程:

 

(1)由SQL接口丢给后面的解释器(Parser),上面已经说到,解释器会判断SQL语句正确与否,若正确则将其转化为数据结构。

 

(2)解释器处理完,便来到后面的优化器(Optimizer),它会产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返会结果。

 

(3)确定最优执行计划后,SQL语句此时便可以交由存储引擎(Engine)处理,存储引擎将会到后端的存储设备中取得相应的数据,并原路返回给程序。

主从复制:

通过创造一个与主数据库环境完全相同的一个从库,使得该从库为主数据库的一个热备份。

主从复制的作用:

        1、部署读写分离,降低单台数据库的IO压力
        2、作为主库的备份,提高数据的安全性
        3、可以实现数据库的高可用

主从复制的工作原理:

1、通过change master  to来指定主库的连接信息以及权限信息,并将这些信息记录到master.info
2、开始执行start slave命令后,从库会生成IO和sql线程,其中io线程负责向主库请求二进制日志文件,并将收到的信息记录到中继日志,sql线程负责监控中继日志文件的内容变化,一旦发生改变,就会将改变的内容,执行到本数据库中。
3、当主库收到从库的日志请求后,主库会派生出一个log_dump线程,负责将二进制日志文件的内容发送给从库
4、从库将改变执行完成后,数据即可保持同步。

主从复制的复制机制:

1、默认的复制方式为异步复制
2、全同步复制
在一个完整的主从复制结构中,主库更改数据后,将新的二进制日志文件内容发送给从库,主库不会直接将结果返回给客户端,直到所有从库通知主库,修改操作已完成,主库才会将结果返回给客户端
3、半同步复制
在一个完整的主从复制结构中,主库更改数据后,将新的二进制日志文件内容发送给从库,主库不会直接将结果返回给客户端,直到有一个从库通知主库,修改操作已完成,主库才会将结果返回给客户端
4、并行复制
产生多个sql线程来共同完成从库数据的重放工作,以此来降低主从复制的延迟。在5.6版本中只能实现库级的并行复制,而在5.7中可以实现事务级

降低mysql主从复制延迟的方法:

1、选择更高效的复制机制来进行主从复制
2、优化网络传输
3、增强从库服务器性能

如何用 mysql 命令进行备份和恢复?以 test 库为例:

备份:mysqldump -h 主机名  -P 端口 -u 用户名 -p 密码 (–database) test> test.sql  

还原:mysql -h 主机名 -u 主机名 -p 密码 test < test.sql 

面试问题

排序的规则?

排序采用order by子句,order by后面跟上排序字段,排序字段后面可以放多个,多个采用逗号间隔,order by默认采用升序,如果存在where子句,那么order by必须放在where 语句后面。
升序 asc
降序 desc
函数的分类?经常使用的函数?

数据处理函数
lower
upper
substr
length
trim(去首尾空格,不会去除中间的空格)
str_to_date(%Y-%m-%d)
date_format
format(保留小数)
round
rand()随机数
ifnull(如果为空,则替换为0)
聚合函数/分组函数
分组函数自动忽略空值
count
sum
avg
min
max
分组查询注意条件?

如果使用了order by,order by 必须放到group by后面。
在sql语句中,select语句后面只能跟分组函数+参与分组的字段。
如果想要对分组数据再进行过滤需要使用having子句。
limit使用方法?

select * from emp limit m,n;

从m+1开始,展示n条数据
创建表时有什么约束条件?

字段名
字段数据类型
字段长度限制
字段约束
mysql常见数据类型?

char:定长字符串,适合做主键或者外键
varchar:可变长字符串
double\float
int\bigint
date
增加删除修改表结构

使用alter table,不影响表中的数据。
 alter table 表名 add 字段名 数据类型(长度) --添加字段
 alter table 表名 modify 字段名 数据类型(长度) --修改字段长度
 alter table 表名 change 原字段名 现在字段名 数据类型(长度) --修改字段名称
 alter table 表名 drop 字段名 --删除字段

常见约束?constraint

非空:not null
唯一约束:unique
主键约束: primary key
外键约束: foreign key
constraint    外键名称 foreign key(当前表字段) references 连接表(连接表字段)      

主键、外键的区别?

主键:唯一标识一条记录,不能有重复,不能为空。
外键:表的外键是另一个表的主键,外键可以为空,可以重复。
mysql和oracle的区别?

oralce的语法更严谨
mysql 特有的存储引擎,oracle等其他数据库没有。
什么是存储过程?用什么来调用?

答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。

char和varchar的区别?

char是一种固定长度的类型:
身份证号、手机号、MD5值
长度较小的
varchar则是一种可变长度的类型:
文本框
字符串很少被更新的,容易产生存储碎片
存储时期?

date:(生日)占用得字节数比使用字符串.datatime.int储存要少,使用date只需要3个字节,存储日期月份,还可以利用日期时间函数进行日期间得计算
datetime:以 YYYY-MM-DD HH:MM:SS 格式存储时期时间,精确到秒,占用8个字节得存储空间,datatime类型与时区无关
Timestamp:以时间戳格式存储,占用4个字节,范围小1970-1-1到2038-1-19,显示依赖于所指定得时区,默认在第一个列行的数据修改时可以自动得修改timestamp列得值
drop,delete与truncate的区别?

drop直接删掉表和表的结构。
truncate删除表中数据,再插入时自增长id又从1开始 。不删除表结构。
delete删除表中数据,可以加where字句。
速度,一般来说: drop> truncate > delete
delete是DML语句,不会自动提交。drop/truncate都是DDL语句,执行后会自动提交。
左连接和右连接的区别。

左连接能查寻到的数据,右连接同样也可以完成。
左连接是显示左表的所有数据,没有匹配的以null值显示。
右连接相反。
数据库设计三范式?

第一范式:每个字段不可再分,主键不能重复。
第二范式:非主键字段完全依赖主键字段。主键可以完全代表整行数据。
第三范式:非主键字段不能传递依赖主键字段,一对多时在多个一方添加外键,不能将部门表的字段添加到员工表中,应该用外键关联部门表,消除数据冗余。
数据库安全

了解XSS攻击吗?如何防止?

XSS攻击全称跨站脚本攻击,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中,扫描到javascript的内容,进行脚本添加攻击。
XSS攻击的危害包括
1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
基于代码修改的防御
对用户提交的内容进行可靠的输入验证,限制提交长度或者格式。其他一律过滤。
session标记。
去掉css和JavaScript的引用内容。
SQL注入漏洞产生的原因?如何防止?

原因:通过设定固定的参数来传参给服务器,查询出一些重要信息,主要原因是没有细致的过滤用户输入的主要内容,导致非法数据侵入系统。
产生的方式:
通过拼接or 1=1 等语句获取信息。
通过表单动态拼接sql
如何预防:
对表单进行验证。
对单引号和双引号进行格式转换。
对用户名密码进行加密。
不使用管理员权限来连接系统,每个应用复制的表建立自己的权限。
项目上线前进行sql注入检测,通过检测软件或者平台。
事务(Transaction)

什么是事务?

一个最小的不可再分的工作单元
通常一个事务对应一个完整的业务
而一个完整的业务需要批量的DML语句共同完成
事务只和DML语句有关
数据库事务的特性。

原子性:整个数据库的操作,要么全部完成,要么全部不完成。不可能停留在中间某个环节,事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有被执行过的状态。
一致性:在事务的开始之前,和事务的结束之后,数据库的完整性约束没有发生破坏。
隔离性:同一时间只有一个请求请求同一数据库。
持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
事务的重点

在事务进行过程中,未结束之前,DML语句是不会修改底层数据库文件中的数据的。
只是将历史纪录一下,在内存中完成记录。
只有在事务结束的,而且是成功结束的时候才会修改底层硬盘文件中的数据。
设置手动提交

默认自动提交是no,将autocommit的值设置为off。

索引

索引的目的是什么?

快速访问数据表中的特定信息,提高检索速度
创建唯一性索引,保证数据库表中每一行数据的唯一性。
加速表和表之间的连接
使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
什么时候使用索引?

表中该字段中的数据量庞大
经常被检索,经常出现在where子句中的字段
经常被DML操作的字段不建议添加索引
索引对数据库系统的负面影响是什么?

创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;
索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;
当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。
索引的使用

主键和外键自动添加索引,所以能通过主键查询的尽量通过主键查询。
create index 索引名 on 表名 (字段名);//创建索引
show index from 表名;//查看索引
1
2
sql使用过程和优化小方法。

1)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
3)很多时候用 exists 代替 in 是一个好的选择,因为in不走索引。

什么是锁?

答:数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

基本锁类型:锁包括行级锁和表级锁

存储引擎

mysql的九种存储引擎

其中三种比较重要
查看当前存储引擎为: show engings\G
MyISAM:可压缩,设置为只读,节省空间。
INnoDB(默认使用):支持事务,外键的完整性,级联删除,级联更新。
MEMORY(记忆):数据存储在内存中,时临时的,数据查询非常快。
如何选择存储引擎?

大量的读少量更新:Myisam。
InnoDB:支持事务和并发。
Memory:非永久需要的数据。
视图(view)

如何创建一个视图?

create view 视图名 as 查询语句

视图有什么作用?

隐藏表的细节。(限制功能,保证数据安全,防止程序员对数据胡乱操作)
提高检索效率。(将经常查询的语句建立视图,下次查询时,直接查询视图)
 

猜你喜欢

转载自blog.csdn.net/ljj987123/article/details/105660956
今日推荐