• MySQL面试题


    MySQL

    1. 高性能sql编写/ SQL语句如何调优
    1. 查询SQL尽量不要使用select *,而是select具体字段
    2. 如果知道查询结果只有一条或者只要最大/最小一条记录,建议用limit 1 (如果查询字段上有唯一索引,可以不加limit 1)
    3. 尽量避免在where子句中使用or来连接条件(用or可能会使索引失效,从而全表扫描)
    4. 优化limit分页
    5. like语句: 把%放前面,并不走索引,% 放关键字后面,还是会走索引的
    6. 使用where条件限定要查询的数据,避免返回多余的行
    7. 避免在索引列上使用mysql的内置函数
    8. 避免在 where 子句中对字段进行表达式操作,这将导致系统放弃使用索引而进行全表扫
    9. Inner join 、left join、right join,优先使用Inner join,如果是left join,左边表结果尽量小
    10. 避免在 where 子句中使用!=或<>操作符
    11. 使用联合索引时,注意索引列的顺序,一般遵循最左匹配原则
    12. 对查询进行优化,应考虑在 where 及 order by 涉及的列上建立索引,尽量避免全表扫描
    13. 如果插入数据过多,考虑批量插入
    14. 适当的时候,使用覆盖索引
    15. 使用explain 分析你SQL的计划

    1. 数据库的死锁问题

    一个用户A 访问表A(锁住了表A),然后又访问表B;另一个用户B 访问表B(锁住了表B),然后企图访问表A;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。

    用户A查询一条纪录,然后修改该条纪录;这时用户B修改该条纪录,这时用户A的事务里锁的性质由查询的共享锁企图上升到独占锁,而用户B里的独占锁由于A 有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。

    如果在事务中执行了一条不满足条件的update语句,则执行全表扫描,把行级锁上升为表级锁,多个这样的事务执行后,就很容易产生死锁和阻塞。

    1. 索引建立准则
    1. 选择唯一性索引
    2. 为经常需要排序、分组和联合操作的字段建立索引
    3. 为常作为查询条件的字段建立索引
    4. 限制索引的数目
    5. 尽量使用数据量少的索引
    6. 尽量使用前缀来索引
    7. 删除不再使用或者很少使用的索引
    8. 最左前缀匹配原则,非常重要的原则。
    9. =和in可以乱序。
    10. 尽量选择区分度高的列作为索引。
    11. 索引列不能参与计算,保持列“干净”。
    12. 尽量的扩展索引,不要新建索引。
    13. 当单个索引字段查询数据很多,区分度都不是很大时,则需要考虑建立联合索引来提高查询效率
    1. 数据库分为哪两种

    传统关系形数据库与非关系型数据库

    1. 都知道什么数据库

    MySQL,Oracle,SQLServer,Redis,Mongo等

    1. 基础CURD,连接查询,分组查询,子查询

    自己复习

    1. mysql分页关键词oracle分页关键词

    mysql: limit 偏移量  查询数据条数

    oracle: rownum,三层子查询, 只能小于,不能大于

    1. mysql的去重函数

    distinct

    1. 数据库外键创建方式

    foreign key(col) references 被引用表(被引用字段)

    1. MySQL事务

    set auto_commit = false , commit ,rollback ,

    savepoint,rollback to

    1. 聚合函数有哪些?

    count, sum , max , min , avg 等等

    1. 左链接,右连接,全连接,内连接的区别

    inner join: 两张表中都满足连接条件的部分数据

    left join : inner join + 左表多出的数据(表部分补NULL)

    right join: inner join + 右表多出的数据(左表部分补NULL)

    full join: 笛卡尔积

    1. 什么时候索引会失效

    详见MySQL 第一题

    1. 数据库索引的作用?

    数据库索引是为了增加查询速度而对表字段附加的一种标识

    1. mysql数据库里的对象

    触发器(Trigger)、表(Table)、视图(View)、存储过程(StoredProcedure)、索引(Index)、缺省值(Default)、图表(Diagram)、用户(User)、规则(Rule)等

    1. 怎么查看数据库字符长度

    char_length 函数 , length 函数查看字节长度

    1. mysql引擎有哪些?有什么区别

    MyISAM,innoDB,MEMORY,ARCHIVE

    InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。

    MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率

    MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果

    如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archiv

    1. mysql怎么写视图

    create view视图名as select语句;

    drop view视图名;

    replace view 视图名 as select语句

    1. 数据库索引有哪些

    普通索引:即针对数据库表创建索引

    唯一索引:与普通索引类似,不同的就是:MySQL 数据库索引列的值

    必须唯一,但允许有空值

    主键索引:它是一种特殊的唯一索引,不允许有空值。一般是在建表的

    时候同时创建主键索引

    组合索引:为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。

    即将数据库表中的多个字段联合起来作为一个组合索引。

    1. 模糊查询%是放在前面查询效率快还是放在后面效率快

    后面,如果放在前面会使索引失效

    1. 如果向数据库添加一条数据,怎么能快速查到你刚刚添加的这一条记录

    order by id desc limit 1

    1. mysql存储过程

    create procedure sp_name()
    begin
    .........
    end

    1. 怎样测试一条sql语句的执行效率

    Explain命令

    1. ddl与dml区别

    数据操作语言 (DML) 和 数据定义语言 (DDL)

    DML:

    SELECT - 从数据库表中获取数据

    UPDATE - 更新数据库表中的数据

    DELETE - 从数据库表中删除数据

    INSERT INTO - 向数据库表中插入数据

    DDL:

    CREATE DATABASE - 创建新数据库

    ALTER DATABASE - 修改数据库

    CREATE TABLE - 创建新表

    ALTER TABLE - 变更(改变)数据库表

    DROP TABLE - 删除表

    CREATE INDEX - 创建索引(搜索键)

    DROP INDEX - 删除索引

    1.DML操作是需要手动控制事务的开启、提交(commit)和回滚的。

    2.DDL操作是隐性提交的,不能rollback!

    1. 为什么mysql里面加了索引就会变快

    很多人会说索引就相当于一本书的目录,通过目录来找书中的某一页,确实是很快的,如果没有目录,就需要一页一页的去翻书了,大大降低了效率。这个比喻其实还挺恰当的,也是一个很经典的索引比喻了。

    在 InnoDB 中,每个索引其实都是一颗 B+ 树,主键索引称作聚簇索引,其他非主键索引称作二级索引,每个表中每一行的记录值都完整的保存在主键索引的叶子节点上,二级索引的叶子节点保存的是主键的值。

    1. Sql having 的作用

    对group by 进行条件过滤

    1. 一个sql语句查询时间很长,你要怎么优化
      1. in 和 not in 要慎用,否则会导致全表扫描
      2. 查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)
      3. 涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合
      4. 如果以上两种都不能操作,非要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度
      5. 针对数量大的表进行历史表分离(如交易流水表)
      6. 数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,mysql有自带的binlog实现 主从同步
      7. explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等
      8. 查看mysql执行日志,看看是否有其他方面的问题
      9. 对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
    2. innodb对一行数据的读会锁吗?

    不加锁,读实际读的是副本

    1. mysql目前用的版本

    5.7 和8.0

    1. Delete、Drop、Truncate的区别?
    • delete是DML语句,可以选择删除部分数据,也可以选择删除全部数据;删除的数据可以回滚;不会释放空间
    • drop是DDL语句,删除表结构和所有数据,同时删除表结构所依赖的约束、触发器和索引;删除的数据无法回滚;会释放空间
    • truncate是DDL语句,删除表的所有数据,不能删除表的部分数据,也不能删除表的结构;删除的数据无法回滚;会释放空间
    • 执行速度:一般来说:drop>truncate>delete
    • 一般使用场景:如果一张表确定不再使用,我们使用drop来操作;如果只是删表中的全部数据,一般使用truncate;如果删除的是表中的部分数据,一般使用delete

    1. 事务四个特性

    原子性、一致性、隔离性、持久性 简称ACID

    1. 事务的隔离级别

    Read Uncommitted(读取未提交内容)

    在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

    Read Committed(读取提交内容)

    这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。

    这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

    Repeatable Read(可重读)

    这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。

    简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

    Serializable(可串行化)

    这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

    1. 如何创建一张表,显示公司所有的部门并找到上下级对应的关系?

    在表中添加外键,引用自己表的主键, 创建树形结构

    1. 数据库表设计三大范式

    第一范式(1NF): 字段具有原子性,不可再分。(所有关系型数据库系

    统都满足第一范式数据库表中的字段都是单一属性的,不可再分)

    第二范式(2NF) 要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。

    第三范式(3NF) 要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

    1. 什么是索引

    数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更

    新数据库表中数据。索引的实现通常使用 B 树及其变种 B+树

    1. [SELECT *] 和[SELECT 全部字段]的 2 种写法有何优缺点

    1. 前者要解析数据字典,后者不需要

    2. 结果输出顺序,前者与建表列顺序相同,后者按指定字段顺序。

    3. 表字段改名,前者不需要修改,后者需要改

    4. 后者可以建立索引进行优化,前者无法优化

    5. 后者的可读性比前者要高

  • 相关阅读:
    1051 Pop Sequence
    二进制间距
    Flutter通过Pigeon插件与Android同步异步交互
    SpringCloud的五大组件简介
    后端学习笔记:Python基础
    百度地图个性化地图失效问题
    vue-element-admin 综合开发四:axios安装和封装、mock安装/学习/使用
    静态代理和动态代理笔记
    理解React页面渲染原理,如何优化React性能?
    Excel文件的操作
  • 原文地址:https://blog.csdn.net/mzl_sx/article/details/125561723