当前位置: 首页 > news >正文

Mysql 面试题

表设置了ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再重启Mysql,再insert一条记录,这条记录的ID是18还是15?

类型MyISAM,18。

因为MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大ID也不会丢失。

类型InnoDB,那么是15。

因为InnoDB表把最大ID主键最大ID记录到内存中,所以重启数据库或者是对表进行OPTIMIZE操作,都会导致最大ID丢失。

Heap 表是什么?

Heap表在mysql中就是memory存储引擎的表

数据保存在内存中,重启mysql数据库数据会消失的

默认使用 Hash 索引

BLOB 和 TEXT字段是不允许的

Mysql 默认端口

3306

InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别

Read Uncommitted(读取未提交内容):所有事务都可以看到其他未提交事务的执行结果

Read Committed(读取提交内容):一个事务只能看见已经提交事务所做的改变

Repeatable Read(可重读):这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。但是会产生幻读,简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。

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

CHAR 和 VARCHAR 的区别

Char 值被存储时,会被用空格填充到特定长度

CHAR 检索速度快,容易造成空间浪费;VARCHAR 不会造成空间浪费。

ENUM 用法

枚举,限定取值范围

CREATE TABLE `size`(`sex` enum('男','女','未知'));

字符类型是

SET、CHAR、VARCHAR、TEXT、BLOB、ENUM

如何获取版本

select version();

InnoDB 中B+树结构

高度为3 B+树能存多少数据

mysql 每页大小:16KB

int 占用大小:4b

bigint 占用大小:8b

指针占用大小: 6b

每页可以索引多少页:16KB/10b=1638

每页可以存多少条数据(假设一条数据1KB):16KB/1KB=16

两层B+树能存多少条数据:1638 * 16 KB / 1KB = 26208

三层B+树能存多少条数据:1638 * 1638 * 16 KB / 1KB = 42,928,704

InnoDB 如何支持范围查找能走索引吗

通过索引查找到指定页表中叶子节点,通过B+树双向指针输出该节点之后或之前的所有节点。

普通索引范围查找可能会导致索引失效,需要进行回表多次

覆盖索引

查询条件字段覆盖索引字段,可以使用索引(包含范围查询)

索引底层扫描

根据包含查询条件的索引树扫描叶子节点

对字段进行操作导致索引失效

对字段进行加减法、类型转换,索引都回失效

字段为字符类型,传入值为int类型。查表之前,mysql会对该字段转换成int类型,非数字都转换成0。

MyISAM 和 InnoDB 区别

InnoDB 支持事务,MyISAM不支持事务

InnoDB支持外键,MyISAM不支持外键

InnoDB是聚集索引, MyISAM非聚集索引

        聚集索引的文件存在主键索引的叶子节点

        非聚集索引的数据文件是分离的,索引保存的是文件的指针

InnoDB 不保存整表的行数,需要进行整表扫描;MyISAM保存整表的行数变量

InnoDB 最小的锁粒度是行锁,MyISAM 最小锁粒度是表锁

MyISAM 优势:大数据量排序、全表扫描、count,由于非聚簇索引不存放数据所占空间小

mylSAM引擎的特点:

1、不支持事务(事务就是逻辑上的一组SQL语句操作,组成这组操作的各个SQL语句,执行时要么全部成功,要么全部失败)
2、表级锁定(更新是锁整个表):其锁定机制是表级锁定,虽然可以让锁定的实现成本很小,但是大大的降低了其并发性能。
小结:MyISAM锁定的范围太大
3、读写互相堵塞:不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。
4、只会缓存索引:MyISAM可以通过key_buffer_size缓存索引,大大提高访问性能,减少磁盘的I/O,但是缓存区只会缓存索引,不会缓存数据。
5、读取速度较快,占用资源相对少。
6、不支持外键约束,但支持全文索引。
7、MyISQM引擎是mysql_5.5.5之前的索引。
 

 MyISAM引擎使用的场景

1、不需要事务支持的业务(转账、充值、付款这种就不行)。
2、一般为读数据比较多的应用。读写都频繁的不适合,读多或写多都适合。
3、并发访问相对低的业务(纯读、纯写高并发也可以)。
4、数据修改相对较少的业务(阻塞问题)。
5、以读为主的业务,例如:www,blog,图片信息数据库,用户数据库,商品库等业务。
6、对数据一致性要求不是很高的业务。
7、硬件资源比较差的机器可以用MyISAM。
小结:单一对数据库的操作都可以使用MyISAM引擎

事务基本特性

原子性

一致性

隔离性

持久性

事务并发可能引发问题

 

 

Mysql各种索引

主键索引

唯一索引 unique

普通索引 normal

前缀索引:

        基于前几个字符或对二进制类型字段的几个bytes建立的索引,而不是在整个字段上建索引。

        前缀索引是一种能使索引更小更快的有效方法,缺点order by 和 group by 失效。 

联合索引:多个数据列

全文索引:建立倒排索引

三星索引

一星:where后面匹配条件,可以匹配联合索引的多个列,索引列匹配字段越多,索引片越窄,最终扫描的数据行越小

二星:order by的排序是否和索引的顺序一致:意义在于避免进行额外的排序,增加消耗

三星:使用了覆盖索引 ,意义在于避免每一个索引行查询,都需要去聚簇索引进行一次随机IO查询

如何提高insert的性能?

  • 合并多条insert为一条:减少 binlog和事务日志量,减少SQL语句的解析次数,减少网络传输的IO
  • 增大批量插入的缓存,修改参数 bulk_insert_buffer_size
  • 设置 innodb_flush_log_at_trx_commit = 0
  • 手动提交事务

全局锁、共享锁、排他锁

全局锁:对整个数据库实例加锁

共享锁:读锁

排他锁:写锁

主从复制

三个线程:Log dump thread、IO线程、SQL线程

mysql 复制原理

  • 从库的IO线程和主库的dump线程建立连接
  • 从库提供file名和position号,IO线程向主库发起binlog的请求
  • 主库dump线程根据从库请求,将本地binlog以events的方式发给从库IO线程
  • 从库IO线程接收binlog events,并存放到本地relay-log中
  • 从库SQL线程应用relay-log

分库分表 

hash 分库分表

按月份分库分表

聚簇索引和非聚簇索引

都是B+树结构

聚簇索引:数据和索引都存放在一起,并按照顺序存储。物理存放顺序数据和索引是一致的

非聚簇索引:B+树叶子节点不存放数据,存储数据的地址,数据存储在磁盘中。

索引设计原则

适合索引where子句中的列,连接子句的列

有外键数据的列一定要建立索引

基数较小的表没必要建立索引

更新频繁字段不适合建立索引

重复值较多列不要建立索引

text、image、bit 数据类型的列不要建立索引

        

意向共享锁 和 意向排他锁

  • 意向共享锁

        当一个事务视图对整个表进行加共享锁之前,需要获取整个表的意向共享锁

  • 意向排他锁

        当一个事务试图对整个表进行加排他锁之前,需要获得整个表的意向排他锁

慢查询优化

分析语句:看是否查询了多余的字段

分析语句执行计划:获得使用索引情况,修改语句或者修改索引,使其尽可能命中索引

如果对语句优化已无法进行,考虑数据量是否太大,考虑横向纵向分表分库

ACID靠什么保证的?

原子性:由 undo log 保证,它记录了回滚的信息

一致性:由其他三个特性一起保证的

隔离性:由MVCC保证

持久性:由 redo log 保证

MVCC

多版本并发控制:读取数据通过一种类似快照的方式 将数据保存来,这样读锁和写锁就不冲突,不同事务session会看到自己特定版本的数据。

MVCC只在 读已提交 和 可重复读 两个隔离级别下工作。

开始事务时创建readview,维护当前活动事务的id,排序生成一个数组,获取数据中的事务id,对比readview:

如果readview的左边,可以访问

如果在readview的右边或者就在readview中,不可以访问,获取roll_ponter,取上一版本重新对比

已提交读隔离级别下的事务每次查询的开始都会生成一个独立的ReadView

可重复读隔离级别则在第一次读的时候只生成一个ReadView


分库分表常用工具 

Mycat

ShardingSphere

什么情况下设置索引但无法使用?

不符合最左前缀原则

字段进行了隐式数据类型转化

走索引没有全表扫描效率高。比如,过大值范围查询,并且超过指定索引字段,需回聚簇索引查询

相关文章:

  • 找回过期的微信文件,赶紧收藏这4个方法!
  • dsox4034a是德科技Keysight DSOX4034A示波器
  • [网鼎杯 2018]Fakebook
  • 《32天SQL筑基》导读
  • 【云原生 | Kubernetes 系列】--Envoy Tcp请求静态配置
  • 【牛客 - 剑指offer】JZ61 扑克牌顺子 两种方案 Java实现
  • 写对比学习损失函数有感(关于速度差异、出现nan的情况)
  • Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day03】——Java高级篇
  • SHRM-人力资源必备的顶流证书
  • 【软件测试】软件测试的相关概念(面试常考)
  • 极光推送厂商通道(小米、华为)对接/问题排查
  • c#开发和学习(基础)
  • java agent简介
  • redis源码实践手册
  • 时间复杂度和空间复杂度❀数据结构
  • Android优雅地处理按钮重复点击
  • JavaScript的使用你知道几种?(上)
  • js操作时间(持续更新)
  • miaov-React 最佳入门
  • MySQL QA
  • React Transition Group -- Transition 组件
  • TypeScript迭代器
  • 记一次用 NodeJs 实现模拟登录的思路
  • 开发基于以太坊智能合约的DApp
  • 理解在java “”i=i++;”所发生的事情
  • 说说动画卡顿的解决方案
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • C# - 为值类型重定义相等性
  • linux 淘宝开源监控工具tsar
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (LeetCode 49)Anagrams
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • ***详解账号泄露:全球约1亿用户已泄露
  • ***原理与防范
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET开源快速、强大、免费的电子表格组件
  • .NET文档生成工具ADB使用图文教程
  • @GetMapping和@RequestMapping的区别
  • [100天算法】-目标和(day 79)
  • [20160902]rm -rf的惨案.txt
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [C进阶] 数据在内存中的存储——浮点型篇
  • [Google Guava] 1.1-使用和避免null