龙空技术网

MYSQL 常见面试题

GavinDjp 198

前言:

现时我们对“mysql流量统计”大体比较珍视,兄弟们都需要知道一些“mysql流量统计”的相关资讯。那么小编在网络上汇集了一些有关“mysql流量统计””的相关资讯,希望看官们能喜欢,兄弟们快快来了解一下吧!

1、 innodb存储引擎和myisam存储引擎的区别?

(1)InnoDB是MySQL默认的存储引擎。

(2)只有 InnoDB 支持事务,MyISAM不支持事务。

(3)MyISAM不支持行级锁和外键, InnoDB支持。

(4)InnoDB表的大小更加的大,用MyISAM可省很多的硬盘空间。

(5)InnoDB 引擎的索引和文件是存放在一起的,找到索引就可以找到数据,是聚簇式设计。

(6)MyISAM 引擎采用的是非聚簇式(即使是主键)设计,索引文件和数据文件不在同一个文件中。

2、聚集索引和非聚集索引的区别?

(1)聚集索引:就是以主键创建的索引,在叶子节点存储的是表中的数据

非聚集索引:就是以非主键创建的索引(也叫做二级索引),在叶子节点存储的是主键和索引列。

(2) 聚集索引中表记录的排列顺序和索引的排列顺序一致;所以查询效率快,因为只要找到第一个索引值记录,其余的连续性的记录在物理表中也会连续存放,一起就可以查询到。缺点:新增比较慢,因为为了保证表中记录的物理顺序和索引顺序一致,在记录插入的时候,会对数据页重新排序。

非聚集索引中表记录的排列顺序和索引的排列顺序不一致。

(3) 聚集索引是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储不连续。

(4) 聚集索引每张表只能有一个,非聚集索引可以有多个。

3、innodb行锁的实现方式?什么是元数据锁?

InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。

元数据锁(metadata lock,简称MDL)是用来保证并发访问数据库对象场景下的一致性而设定的。简单理解,它是为了管理数据库元数据而产生的一种锁。事务中有dml操作的时候,事务没有提交的情况下,进行alter table或者drop table这种DML操作,会出现元数据锁等待。

4、脏读幻读和不可重复读的区别?

脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问 这个数据,然后使用了这个数据。

不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不 可重复读。例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果 只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。

幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉一样。例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。 如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。

5、MySQL空值和null的区别?

(1)空值不占空间,NULL 值占空间。当字段不为 NULL 时,也可以插入空值。

(2)当使用 IS NOT NULL 或者 IS NULL 时,只能查出字段中没有不为 NULL 的或者为 NULL 的,不能查出空值。

(3)判断 NULL 用 IS NULL 或者 is not null,SQL 语句函数中可以使用 IFNULL() 函数来进行处理,判断空字符用 =’‘或者 <>’'来进行处理。

(4)在进行 count() 统计某列的记录数的时候,如果采用的 NULL 值,会别系统自动忽略掉,但是空值是会进行统计到其中的。

(5)MySql 中如果某一列中含有 NULL,那么包含该列的索引就无效了。这一句不是很准确。

6、什么是B+树索引,和B书索引的区别?

MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。

B+树索引是在B树索引(平衡对找二叉树)改进而来。B+树中的节点并不存储数据本身,而是只是作为索引。除此之外,每个叶子节点串在一条链表上,链表中的数据是从小到大有序的。如果我们要求某个区间的数据。我们只需要拿区间的起始值,在树中进行查找,当查找到某个叶子节点之后,我们再顺着链表往后遍历,直到链表中的结点数据值大于区间的终止值为止。所有遍历到的数据,就是符合区间值的所有数据。

B+ 树查询效率更稳定。**因为 B+ 树每次只有访问到叶子节点才能找到对应的数据,而在 B 树中,非叶子节点也会存储数据,这样就会造成查询效率不稳定的情况,有时候访问到了非叶子节点就可以找到关键字,而有时需要访问到叶子节点才能找到关键字。

B+ 树的查询效率更高,这是因为通常 B+ 树比 B 树更矮胖(阶数更大,深度更低),查询所需要的磁盘 I/O 也会更少。同样的磁盘页大小,B+ 树可以存储更多的节点关键字。

7、场景问题排查:mysql数据库主机CPU使用率较高怎么排查问题?又有哪些常见的问题会引起mysqld进程CPU使用率过高?

(1)、通过TOP、vmstat 等确定CPU负载过高,确定mysql 进程PID

(2)查看mysql 流量、慢sql 等监控是否有异常

(3)查看mysql线程使用的CPU情况:pidstat -t -p PID

(4)进入MYSQL找到对应的SQL:SELECT * FROM performance_schema.threads

(5)找不到可从锁,慢sql 入手:

SELECT * FROM information_schema.INNODB_TRX;

查看一下有没有执行时间特别长的语句,或者资源耗费特别大的。找出来优化。

cpu使用率过高可能和流量和慢查询有一定的关系。单位时间 CPU 资源 = 查询执行的平均成本 x 单位时间执行的查询数量

cpu使用率与【查询执行的平均成本】和【单位时间执行的查询数量】线性相关,而这两项就是我们常说的慢sql以及数据库QPS。

一般而言,cpu使用率飙升可归纳为以下两点:

大量的慢sql占用了cpu资源,拖垮了数据库,这类的慢sql常常表现为:查询的数据量过大,全表扫描、锁抢占甚至死锁、复杂查询等

QPS过高,本质上是数据库的承载的流量过大

标签: #mysql流量统计