| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MySQL面试重点 -> 正文阅读 |
|
[大数据]MySQL面试重点 |
说说MySQL 的基础架构图Mysql逻辑架构图主要分三层:
一条SQL查询语句在MySQL中如何执行的?
日常工作中你是怎么优化SQL的?SQL优化优化表结构
优化查询
优化索引
怎么看执行计划(explain),如何理解其中各个字段的含义?在 select 语句之前增加 explain 关键字,会返回执行计划的信息。 id 列:是 select 语句的序号,MySQL将 select 查询分为简单查询和复杂查询。 select_type列:表示对应行是是简单还是复杂的查询。 table 列:表示 explain 的一行正在访问哪个表。 type 列:最重要的列之一。表示关联类型或访问类型,即 MySQL 决定如何查找表中的行。 从最优到最差分别为:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL possible_keys 列:显示查询可能使用哪些索引来查找。 key 列:这一列显示 mysql 实际采用哪个索引来优化对该表的访问。 key_len 列:显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。 ref 列:这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),func,NULL,字段名。 rows 列:这一列是 mysql 估计要读取并检测的行数,注意这个不是结果集里的行数。 Extra 列:显示额外信息。比如有 Using index、Using where、Using temporary等。 关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?我们平时写Sql时,都要养成用explain分析的习惯。慢查询的统计,运维会定期统计给我们优化慢查询思路: 慢查询优化
聚集索引与非聚集索引的区别
为什么要用 B+ 树,为什么不用普通二叉树?可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数,为什么不是普通二叉树,为什么不是平衡二叉树,为什么不是B树,而偏偏是 B+ 树呢? 为什么不是普通二叉树?如果二叉树特殊化为一个链表,相当于全表扫描。平衡树相比于查找树来说,总体的查找速度更快,查找效率也更稳定。 为什么不是平衡二叉树呢?在磁盘比在内存的数据,查询效率慢得多。如果树这种数据结构作为索引,那我们每查找一次数据就需要从磁盘中读取一个节点。平衡二叉树可是每个节点只存储一个键值和数据的,如果是B树(平衡多叉树),可以存储更多的节点数据,树的高度也会降低,因此读取磁盘的次数就降下来啦,查询效率就快啦。 为什么不是 B 树而是 B+ 树呢?B+ 树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。innodb中页的默认大小是16KB,如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也会更快。 B+ 树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的,链表连着的。那么 B+ 树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。 Hash 索引和 B+ 树索引区别是什么?你在设计索引是怎么抉择的?
什么是最左前缀原则?什么是最左匹配原则?最左前缀原则,就是最左优先,在创建多列索引时,要根据业务需求,where 子句中使用最频繁的一列放在最左边。 最左匹配原则,就是当我们创建一个组合索引的时候,如 (a1,a2,a3),相当于创建了(a1)、(a1,a2)和(a1,a2,a3)三个索引。 索引不适合哪些场景?
索引有哪些优缺点?优点
缺点
MySQL 遇到过死锁问题吗,你是如何解决的?
说说数据库的乐观锁和悲观锁是什么以及它们的区别?悲观锁悲观锁只属于当前事务,一个事务拥有(获得)悲观锁后,其他任何事务都不能对数据进行修改,只能等待锁被释放才可以执行。 乐观锁乐观锁的“乐观情绪”体现在,它认为数据的变动不会太频繁。因此,它允许多个事务同时对数据进行变动。 实现方式:乐观锁一般会使用j版本号机制或kCAS算法实现。 MVCC 熟悉吗,知道它的底层原理?MVCC (Multiversion Concurrency Control),即多版本并发控制技术。 MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。 MySQL事务得四大特性以及实现原理
事务的隔离级别有哪些?MySQL的默认隔离级别是什么?
Mysql默认的事务隔离级别是可重复读(Repeatable Read) 什么是幻读,脏读,不可重复读呢?事务A、B交替执行,事务A被事务B干扰到了,因为事务A读取到事务B未提交的数据,这就是脏读。 在一个事务范围内,两个相同的查询,读取同一条记录,却返回了不同的数据,这就是不可重复读。 事务A查询一个范围的结果集,另一个并发事务B往这个范围中插入/删除了数据,并静悄悄地提交,然后事务A再次查询相同的范围,两次读取得到的结果集不一样了,这就是幻读。 MySQL数据库cpu飙升的话,要怎么处理呢?排查过程使用top 命令观察,确定是mysqld导致还是其他原因。 如果是mysqld导致的,show processlist,查看session情况,确定是不是有消耗资源的sql在运行。 找出消耗高的 sql,看看执行计划是否准确, 索引是否缺失,数据量是否太大。 处理kill 掉这些线程(同时观察 cpu 使用率是否下降) 进行相应的调整(比如说加索引、改 sql、改内存参数) 重新跑这些 SQL。 其他情况也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升,这种情况就需要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等 MYSQL的主从延迟,你怎么解决?主从复制分了五个步骤进行
主从同步延迟的原因一个服务器开放N个链接给客户端来连接的,这样有会有大并发的更新操作, 但是从服务器的里面读取binlog的线程仅有一个,当某个SQL在从服务器上执行的时间稍长 或者由于某个SQL要进行锁表就会导致,主服务器的SQL大量积压,未被同步到从服务器里。这就导致了主从不一致, 也就是主从延迟。 主从同步延迟的解决办法
如果让你做分库与分表的设计,简单说说你会怎么做?分库分表方案
常用的分库分表中间件
分库分表可能遇到的问题
如何设计一个高并发的系统
锁的优化策略
什么情况下设置了索引但无法使用?
实践中如何优化MySQL我当时是按以下四条依次回答的,他们四条从效果上第一条影响最大,后面越来越小。
sql注入的主要危害
优化数据库的方法
简单描述mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。 普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一性。 主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。 索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引,这就是联合索引。 索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。 SQL注入漏洞产生的原因?如何防止?SQL注入产生的原因程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。 防止SQL注入的方式
对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题:索引的目的是什么?
索引对数据库系统的负面影响是什么?
为数据表建立索引的原则有哪些?
什么情况下不宜建立索引?
简述在MySQL数据库中MyISAM和InnoDB的区别
InnoDB与MyISAM的区别:
解释MySQL外连接、内连接与自连接的区别
写出三种以上MySQL数据库存储引擎的名称MyISAM、InnoDB、BDB(BerkeleyDB)、Merge、Memory(Heap)、Example、Federated、 Archive、CSV、Blackhole、MaxDB 等等十几个引擎 Myql中的事务回滚机制概述事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。 要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚 SQL语言包括哪几部分?每部分都有哪些操作关键字?答:SQL语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)四个部分。
完整性约束包括哪些?答:数据完整性(Data Integrity)是指数据的精确(Accuracy)和可靠性(Reliability)。 分为以下四类:
与表有关的约束:包括列约束(NOT NULL(非空约束))和表约束(PRIMARY KEY、foreign key、check、UNIQUE) 。 什么是事务?及其特性?答:事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。 事务特性:
什么是锁?数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。 加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。 基本锁类型:锁包括行级锁和表级锁 什么叫视图?游标是什么?视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。 游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。 什么是存储过程?用什么来调用?存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。 如何通俗地理解三个范式? ?
范式化设计优缺点优点可以尽量得减少数据冗余,使得更新快,体积小 缺点对于查询需要多个表进行关联,减少写得效率增加读得效率,更难进行索引优化 反范式化优点可以减少表得关联,可以更好得进行索引优化 缺点数据冗余以及数据异常,数据得修改需要更多的成本 什么是基本表?什么是视图?基本表是本身独立存在的表,在 SQL 中一个关系就对应一个表。 ?视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中,是一个虚表 ? 试述视图的优点?
NULL是什么意思NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个 NULL值进行比较,并在逻辑上希望获得一个答案。 使用IS ?NULL来进行NULL判断 主键、外键和索引的区别?主键--唯一标识一条记录,不能有重复的,不允许为空 外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值 索引--该字段没有重复值,但可以有一个空值 作用
个数
你可以用什么来确保表格里的字段只接受特定范围里的值?Check限制,它在数据库表格里被定义,用来限制输入该列的值。 触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,这可能会在某些情况下影响到性能。 说说对SQL语句优化有哪些方法?(选择几条)(1)Where子句中:where表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。 (2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。 (3) 避免在索引列上使用计算 (4)避免在索引列上使用IS NULL和IS NOT NULL (5)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 (6)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描 (7)应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描 SQL语句中‘相关子查询’与‘非相关子查询’有什么区别?子查询:嵌套在其他查询中的查询称之。 子查询又称内部,而包含子查询的语句称之外部查询(又称主查询)。 所有的子查询可以分为两类,即相关子查询和非相关子查询
char和varchar的区别?是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是: ? char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足。(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)。?? varchar得适用场景字符串列得最大长度比平均长度大很多 2.字符串很少被更新,容易产生存储碎片 3.使用多字节字符集存储字符串 Char得场景? ? 存储具有近似得长度(md5值,身份证,手机号),长度比较短小得字符串(因为varchar需要额外空间记录字符串长度),更适合经常更新得字符串,更新时不会出现页分裂得情况,避免出现存储碎片,获得更好的io性能 数据表类型有哪些? ? ? ?答:MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等。 ? ? ? ?MyISAM:成熟、稳定、易于管理,快速读取。一些功能不支持(事务等),表级锁。 ? ? ? ?InnoDB:支持事务、外键等特性、数据行锁定。空间占用大,不支持全文索引等。 MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题?
为表中得字段选择合适得数据类型(物理设计)?字段类型优先级: 整型>date,time>enum,char>varchar>blob,text ?优先考虑数字类型,其次是日期或者二进制类型,最后是字符串类型,同级别得数据类型,应该优先选择占用空间小的数据类型 存储时期
注意:不要使用字符串类型来存储日期时间数据(通常比字符串占用得储存空间小,在进行查找过滤可以利用日期得函数) 使用int存储日期时间不如使用timestamp类型 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 3:54:54- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |