MySQL数据库常见问题

 1、MySQL框架了解

server层包括:

1、连接器:负责和客户端建立链接,获取权限,管理链接

2、查询缓存:在一个查询语句中,回先到缓存中查看之前是否查询过这条语句(前提是开启了查询缓存功能),若存在则直接返回缓存的结果,优点时命中缓存时效率很高,缺点是缓存失效非常频繁,只要有对一个表更新,该表所有的查询缓存都会被清空

3、分析器:对SQL语句进行词法分析和语法分析,判断语句是否合法

4、优化器:对SQL语句进行优化,选择索引

5、执行器:调用存储引擎接口,返回结果

存储引擎负责:数据的存储和提取,结构式是插件式的,支持InnoDB和MylSAM等多个存储引擎,默认INNODB,建表的时候可以通过engine=MylSAM来指定存储引擎。

2、一条SQL语句在数据库框架中的执行流程

1、连接器:通过连接器,客户端与服务器建立链接

2、查询缓存:服务器拿到SQL,首先去查看是否执行过该语句,执行过的话会存有缓存,命中该缓存直接返回给客户端,缓存失效非常频繁,只要对一个表进行更新,该表所有的缓存都会被清空,MySQL8.0版本已经删除了查询缓存的功能

3、分析器:如果没有命中缓存,通过分析器开始对语句进行词法分析,解析关键词,在进行语法分析,确定语句符合语法规范

4、优化器:对于据进行优化,选择索引,确定语句的执行方案

5、执行器:判断是否对表有执行权限, 如果有权限,就打开表继续执行,根据表的存储引擎定义,通过这个引擎提供的接口获得数据并返回结果

3、数据库的三范式是什么:

范式的话是一种“关系型数据库”设置的一种规范,目标是消除冗余,建立结构合理的数据库,从而提升数据存储和使用的性能。

第一范式:确保每列的原子性,表中的每一个字段都是不可分割的,同一列中不能有多个值。第一范式是关系模型的基本要求,不满足第一范式的数据库不是关系型数据库,第一范式要根据实际需求而定。

第二范式:确保唯一性和依赖性,每个表都有主键,其他数据字段完全依赖主键

第三范式:非主键字段必须直接依赖主键,不能存在传递依赖

4、什么是范式和反范式,各自优缺点?

范式是符合某一种级别的关系模型的集合。构造数据库必须遵循一定的规则,在关系性数据库中,规则就是范式

范式优点:消除冗余,使得数据表更新操作快,占用的存储空间也少

范式缺点:查询时通常需要多表关联查询,进行索引优化时操作困难

 

反范式得过程就是通过冗余数据来提高查询性能,但冗余数据会牺牲数据得一致性

1、反范式的优点:所有的数据都在同一张表中,可以减少表关联,更好的进行索引优化

2、反范式的缺点:存在大量的冗余数据,维护成本高。

5、limit 1000000,10加载很慢,怎么解决?

 

limit1000000,10加载很慢是因为会将数据库的前1000000+10行全部取出,然后再舍弃前1000000行,所以很慢,优化方向为直接确定第1000000行数据并进行索引覆盖。

(1)、如果id时连续的并且没有where条件,可以直接 where id>1000000,再进行limit

select name,id from emp limit 1000000,10;
select name id from emp where id >1000000,limit 10;

(2)、如果id不是连续的并且没有where条件,通过子查询得到第1000000条数据再limit

select name , id from emp where id>(selece id from emp limit 1000000,1) limit 10; 

(3)、建立索引,通过覆盖索引避免回表:

select id,name from emp where sex='m' limit 1000000,10;

select id,name from emp join (select id from emp where sex='m' limit 1000000,10)e on where emp.id=e.id;

6、char与varchar区别:

    char(n)固定长度类型,比如:订阅char(10),当输入'abc'三个字符时,所占空间还是10个字节,其他7个字节是空字节。  

   char优点:效率高  缺点:占用空间;  适用场景:存储密码的md5值,固定长度的,使用char非常合适

   varchar可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节长度。所以,从空间上考虑varchar比较合适,从效率上考虑,char比较合适,二者使用需要进行权衡。

1df86d5b7f514e97b674b78beb451450.png

7、varchar(10)和varchar(20)区别:

   varchar(10)中的10表示最多存放十个字符,比如二者存放'hello'的长度都是一样的,但是varchar(20)会在排序时消耗更多内存空间,因为order by col采用fixed_length计算col长度。

实际使用时,为了避免浪费空间,需要根据具体的数据来决定

8、drop、delete、turncate的区别

·drop:删除整个表,包括数据和结构,属于DDL,不能回滚

·truncate:删除表中的所有数据,速度快,属于DDL,不能回滚

·delete:删除表中和部分或者全部数据,逐行删除,速度慢,属于DML可以回滚

速度:drop>truncate>delete

9、UNION与UNION ALL区别

Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则排序

Union All:对两个结果集进行并集操作,包括重复行,不进行排序

UNION的效率要高于UNION ALL

10、Mysql内连接、左连接、右链接有什么区别?

inner join:内连接,在两张表进行链接查询时,只保留两张表中完全匹配的结果集。

left join:在两张表进行链接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。

right join:在两张表进行连接查询时,会返回右表所有的行,即使在坐标中没有匹配的记录。

11、常见额度聚合函数有哪些?使用聚合函数需要注意什么?

avg(expression):返回某列的平均值

sum(expression):返回某列的和

count(expression):返回某列的行数

max(expression):返回某列的最大值

min(expression):返回某列的最小值

  注意:在使用聚合函数时,会自动忽略空值,不需要手动增加条件排除NULL

             聚合函数不能作为where子句后的限制条件

12、一条SQL查询语句的执行顺序:

/*
以下关键字的顺序不能改变,必须严格遵循,以下按照正常SQL语句来写,数字表示执行顺序
*/
6  select 字段名 (对 临时表进行整列读取)
7  distinct 字段名 (去除重复数据)
1  from 表名 (对硬盘上的表文件加载到内存)
3  join 表名 (链接外表)
2  on 表名  (对主表进行过滤)
4  where   (将符合条件的数据惊醒摘取形成一张新的临时的表)
5  group by (格局列中的数据种类,将当前临时表换分成若干个新的临时表)
8  having (可以过滤掉 group by生成的不符合条件的临时表)
9  order by (对select生成的临时表重新排序,生成新的临时表)
10 limit  (对最终生成的临时表数据进行截取)

13、索引的分类

        从数据结构的角度

 (1)、B+树索引:B+树索引就是传统意义上的索引,是目前关系型数据库中查找最为常用和最为有效的索引。B+树索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据。B+树索引是顺序组织存储的没因为很适合查找范围数据。B+树索引分为聚簇索引(主键索引)和非聚簇索引(二级索引)

(2)、Hash索引:基于哈希表实现,查找非常快,但是不支持范围查找和排序操作,也不支持部分索引列的查找。只支持等值比较的查询。如果哈希冲突非常多的话,索引的维护代价会很高。因此,哈希索引只使用某系特定的场合,在InnoDB中,支持的哈希索引是自适应的,不能人为创建

        从物理存储角度来看:

(1)、聚簇索引:索引的键值的逻辑顺序与表中的相应行的物理顺序一致,也就是每张表只能由一个聚簇索引

(2)、非聚簇索引:逻辑顺序与数据行的物理顺序不一致

        从逻辑角度:

(1)、普通索引:基本的索引类型,没有唯一性的限制,允许为NULL值

(2)、唯一索引:索引列中的值必须是唯一的。但是允许为空值

(3)、主键索引:特殊的唯一索引,也称聚簇索引,不允许有控制,并由数据库帮我们自动创建

(4)、联合索引:组合表中多个字段创建的索引,遵循最左前缀匹配规则

(5)、全文索引:用于全文搜索的索引类型,了可以执行关键字搜索引,全文索引有很多限制,例如当数据量很大的时候,内存无法装载全部的索引时,搜索速度会非常慢。全文索引的维护成本也很大。

(6)、空间索引:用于优化空间数据类型的查询。(比如地理坐标)

14、索引的优缺点:

优点:

        ·减少服务器需要扫描的数据量

        ·帮助服务器避免排序和临时表

        ·索引可以将随机I/O变为顺序I/O,提高查询性能

缺点:

        ·从空间角度考虑的话,建立索引需要占用物理空间

        ·从时间调度考虑的话,创建和维护索引都需要花费时间,例如对数据进行增删改查都需要维护索引

15、索引的设计原理:

·为常作为查询条件的字段建立索引:如果某个字段经常用来做查询条件,那么这个字段的查询速度会影响整个表的查询速度。因此。为这样的字段建立索引,可以提高整个表的查询速度

·为经常需要排序、分组和联合操作的字段建立索引:经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。如果简历索引的话,可能有效的避免排序操作。

·选择唯一性索引:唯一性索引的值是唯一的,可以更快的用过该索引来确定某条记录

·限制索引的数目:每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大,修改表的时候,对索引的重构和更新都很麻烦

·小表不建议建立索引(数据量在百万以内):由于数据较小,查询花费的时间可能比索引的时间更短,索引可能不会产生优化效果

·尽量使用前缀索引:如果索引的值很长,那么查询的虚度会收到映像。

·删除不再使用或者很少使用的索引

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值