目录
一、MySQL 数据类型
1. 数据库存储日期格式时,如何考虑时区转换问题?
2. Blob和text有什么区别?
3. mysql里记录货币用什么字段类型比较好?
4. MySQL如何获取当前日期?
5. 你们数据库是否支持emoji表情存储,如果不支持,如何操作?
6. varchar(50)中50的涵义
7. mysql中int(20)和char(20)以及varchar(20)的区别
8. 字段为什么要求定义为not null?
9. 如果要存储用户的密码散列,应该使用什么字段进行存储?
10. MySQL中DATETIME和TIMESTAMP的区别
11. MySQL中TEXT数据类型的最大长度
二、关联查询
1. Mysql 的内连接、左连接、右连接有什么区别?(已整合)
2. 什么是内连接、外连接、交叉连接、笛卡尔积呢?
3. 谈谈六种关联查询,使用场景。
4. UNION与UNION ALL的区别?
三、主键问题
1. 如何选择合适的分布式主键方案呢?
2. 数据库自增主键可能遇到什么问题
3. 主键使用自增ID还是UUID,为什么?
4. mysql自增主键用完了怎么办?
四、MySQL架构
1. 说说MySQL 的基础架构图
2. Mysql的binlog有几种录入格式?分别有什么区别?
3. InnoDB引擎的4大特性,了解过吗
五、存储引擎
1. InnoDB与MyISAM的区别
2. InnoDB引擎中的索引策略,了解过吗?
六、索引问题
1. MySQL 索引使用有哪些注意事项呢?
2. 数据库索引的原理,为什么要用 B+树,为什么不用二叉树?
3. 聚集索引与非聚集索引的区别
4. 如何写sql能够有效的使用到复合索引
5. Hash索引和B+树区别是什么?你在设计索引是怎么抉择的?
6. 索引有哪些优缺点?
7. 索引有哪几种类型?
8. 创建索引有什么原则呢?
9. 创建索引的三种方式
10. 百万级别或以上的数据,你是如何删除的?
11. 什么是最左前缀原则?什么是最左匹配原则?
12. B树和B+树的区别,数据库为什么使用B+树而不是B树?
13. 覆盖索引、回表等这些,了解过吗?
14. B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据?
15. 何时使用聚簇索引与非聚簇索引
16. 非聚簇索引一定会回表查询吗?
17. 组合索引是什么?为什么需要注意组合索引中的顺序?
18. 列值为NULL时,查询是否会用到索引?
七、SQL优化
1. SQL优化的一般步骤是什么,怎么看执行计划(explain),如何理解其中各个字段的含义。
2. 如果某个表有近千万数据,CRUD比较慢,如何优化
3. 说一下大表查询的优化方案
4. 关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?
5. 如何优化长难的查询语句?有实战过吗?
6. 优化特定类型的查询语句
7. 谈谈MySQL的Explain
八、锁问题
1. MySQL 遇到过死锁问题吗,你是如何解决的?
2. 在高并发情况下,如何做到安全的修改同一行数据?
3. 数据库的乐观锁和悲观锁
4. select for update有什么含义,会锁表还是锁行还是其他。
5. Mysql中有哪几种锁,列举一下?
6. 隔离级别与锁的关系
7. 按照锁的粒度分,数据库锁有哪些呢?锁机制与InnoDB锁算法
8. 从锁的类别角度讲,MySQL都有哪些锁呢?
9. MySQL中InnoDB引擎的行锁是怎么实现的?
10. 什么是死锁?怎么解决?
11. Mysql一条SQL加锁分析
九、事务
1. 事务的隔离级别有哪些?MySQL的默认隔离级别是什么?
2. 什么是幻读,脏读,不可重复读呢?
3. MySQL事务得四大特性以及实现原理
4. MVCC熟悉吗,它的底层原理?
5. 什么是数据库事务?
6. Innodb的事务实现原理?
7. Innodb的事务与日志的实现方式
十、SQL执行过程
1. 一条SQL语句在MySQL中如何执行的?
2. 一条sql执行过长的时间,你如何优化,从哪些方面入手?
3. 一条Sql的执行顺序?
十一、视图 & 游标 & 存储过程 & 存储函数 & 触发器等
1. 为什么要使用视图?什么是视图?
2. 视图有哪些特点?哪些使用场景?
3. 视图的优点,缺点,讲一下?
4. 什么是游标?
5. 什么是存储过程?有哪些优缺点?
6. 什么是触发器?触发器的使用场景有哪些?
7. MySQL中都有哪些触发器?
十二、分布式问题
1. 说说分库与分表的设计
2. 数据库中间件了解过吗,sharding jdbc,mycat?
3. MYSQL的主从延迟,你怎么解决?
4. 读写分离常见方案?
5. MySQL的复制原理以及流程
6. 你是否做过主从一致性校验,如果有,怎么做的,如果没有,你打算怎么做?
十三、生产实际问题
1. 日常工作中你是怎么优化SQL的?
2. MySQL数据库cpu飙升的话,要怎么处理呢?
3. 500台db,在最快时间之内重启
4. 你是如何监控你们的数据库的?你们的慢日志都是怎么查询的?
十四、其它问题
1. mysql中in和exists的区别
2. MYSQL数据库服务器性能分析的方法命令有哪些?
3. 说一下数据库的三大范式
4. mysql有关权限的表有哪几个呢?
5. 一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录
6. count(1)、count(*) 与 count(列名) 的区别?
7. 超键、候选键、主键、外键分别是什么?
8. SQL 约束有哪几种呢?
9. drop、delete与truncate的区别
10. SQL的生命周期?
11. Mysql驱动程序是什么?
12. 什么是数据库连接池?为什么需要数据库连接池呢?
变,除非手动修改它。
值都会被自动更新。
如何考虑时区转换问题/看一下这个吧:数据库存储日期格式时,如何考虑时区转换问题?
序和比较。
被用于保存与金钱有关的数据。
小数点后的位数。存储在salary列中的值的范围是从-9999999.99到9999999.99。
更换字符集utf8-->utf8mb4
null值会占用更多的字节,并且null有很多坑的。
密码散列,盐,用户身份证号等固定长度的字符串,应该使用char而不是varchar来存储,这样可以节省空间
且提高检索效率。
存储精度都为秒
区别:
匹配关系的记录。
1. 显示结果不同
union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果集全部显示出来
2. 对重复结果的处理不同
union all是直接连接,取到的是所有值,记录可能有的重复;union是取唯一值,记录没有重复。
所以union在进行表链接后会筛选掉重复的记录,union all不会去除重复记录。
3. 对排序的处理不同
union会按照字段的顺序进行排序;union all 只是将两个结果集合并后就返回。
结论:从效率上讲,union all要比 union快的多,所以如果确定合并的两个结果集中没有重复且不
需要排序就用Union all。
解决方案的话,简单点的话可以考虑使用UUID哈
如果是单机的话,选择自增ID;如果是分布式系统,优先考虑UUID吧,但还是最好自己公司有一套分布式唯
一ID生产方案吧。
能有问题。
自增主键一般用int类型,一般达不到最大值,可以考虑提前分库分表的。
Mysql逻辑架构图主要分三层:
有三种格式哈,statement,row和mixed。
志量,节约了IO,提高性能。由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同
时还有一些使用了函数之类的语句无法被记录复制。
全部记下来但是由于很多操作,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息
太多,日志量太大。
索引下推优化是 MySQL 5.6 引入的, 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不
满足条件的记录,减少回表次数。
这篇文章非常不错,大家去看一下吧:聊一聊 InnoDB 引擎中的这些索引策略
可以从三个维度回答这个问题:索引哪些情况会失效,索引不适合哪些场景,索引规则
索引哪些情况会失效
后端程序员必备:索引失效的十大杂症
索引不适合哪些场景
索引的一些潜规则
可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数,为什么不
是二叉树,为什么不是平衡二叉树,为什么不是B树,而偏偏是B+树呢?
为什么不是一般二叉树?
如果二叉树特殊化为一个链表,相当于全表扫描。平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体
的查找速度也更快。
为什么不是平衡二叉树呢?
我们知道,在内存比在磁盘的数据,查询效率快得多。如果树这种数据结构作为索引,那我们每查找一次数据
就需要从磁盘中读取一个节点,也就是我们说的一个磁盘块,但是平衡二叉树可是每个节点只存储一个键值和
数据的,如果是B树,可以存储更多的节点数据,树的高度也会降低,因此读取磁盘的次数就降下来啦,查询
效率就快啦。
那为什么不是B树而是B+树呢?
页的默认大小是16KB,如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)
就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也
会更快。
查找,排序查找,分组查找以及去重查找变得异常简单。
可以看这篇文章哈:再有人问你为什么MySQL用B+树做索引,就把这篇文章发给她
磁盘上行的物理存储顺序不同。
聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。
何时使用聚集索引或非聚集索引?
复合索引,也叫组合索引,用户可以在多个列上建立索引,这种索引叫做复合索引。
当我们创建一个组合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是
最左匹配原则。
有关于复合索引,我们需要关注查询Sql条件的顺序,确保最左匹配原则有效,同时可以删除不必要的冗余索
引。
法进行模糊查询。
优点:
缺点:
1:在执行CREATE TABLE时创建索引
2:使用ALTER TABLE命令添加索引
3:使用CREATE INDEX命令创建
在最左边。
这就是最左匹配原则。。
放键和值。
查找,排序查找,分组查找以及去重查找变得异常简单。.
中页的默认大小是16KB,如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点
树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询
的效率也会更快.
据,这种通过二级索引查询出来的过程,就叫做回表。
网上这篇文章讲得很清晰:mysql覆盖索引与回表
是聚簇索引和非聚簇索引。 在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键
建立聚簇索引。如果没有唯一键,则隐式的生成一个键来建立聚簇索引。
不一定,如果查询语句的字段全部命中了索引,那么就不必再进行回表查询
(哈哈,覆盖索引就是这么回事)。
举个简单的例子,假设我们在学生表的上建立了索引,那么当进行select age from student where age <
20的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询。
组合索引,用户可以在多个列上建立索引,这种索引叫做组合索引。
因为InnoDB引擎中的索引策略的最左原则,所以需要注意组合索引中的顺序。
列值为NULL也是可以走索引的
计划对列进行索引,应尽量避免把它设置为可空,因为这会让 MySQL 难以优化引用了可空列的查询,同时增
加了引擎的复杂度
(这点非常重要,日常开发中用它分析Sql,会大大降低Sql导致的线上事故)
看过这篇文章,觉得很不错:优化sql 语句的一般步骤
分库分表
某个表有近千万数据,可以考虑优化表结构,分表(水平分表,垂直分表),当然,你这样回答,需要准备好
面试官问你的分库分表相关问题呀,如
索引优化
除了分库分表,优化表结构,当然还有所以索引优化等方案~
有兴趣可以看这篇文章哈~
后端程序员必备:书写高质量SQL的30条建议
为了有好的查询效率,表结也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数
据定位到限定的表上去查,而不是扫描全部的表;
limit 1000000,10这种查询其实也是有可以优化的余地的. 这条语句需要load1000000数据然后基本上全
部丢弃,只取10条当然比较慢. 当时我们可以修改为select * from table where id in (select id from
table where age > 20 limit 1000000,10).这样虽然也load了一百万的数据,但是由于索引覆盖,要查询的
所有字段都在索引中,所以速度会很快. 同时如果ID连续的好,我们还可以select * from table where id >
1000000 limit 10,效率也是不错的,优化的可能性有许多种,但是核心思想都一样,就是减少load的数据.
看或者按照给定的路线走,
优化慢查询:
有兴趣可以看这篇文章哈~后端程序员必备:书写高质量SQL的30条建议
平时积累吧:
有兴趣可以看这篇文章哈~后端程序员必备:书写高质量SQL的30条建议
Explain 执行计划包含字段信息如下:分别是 id、select_type、table、partitions、type、possible_keys、
key、key_len、ref、rows、filtered、Extra 等12个字段。
我们重点关注的是type,它的属性排序如下:
system > const > eq_ref > ref > ref_or_null >
index_merge > unique_subquery > index_subquery >
range > index > ALL
推荐大家看这篇文章哈:面试官:不会看 Explain执行计划,简历敢写 SQL 优化?
我排查死锁的一般步骤是酱紫的:
可以看我这两篇文章哈:
要安全的修改同一行数据,就要保证一个线程在修改时其它线程无法更新这行记录。
一般有悲观锁和乐观锁两种方案~
使用悲观锁
悲观锁思想就是,当前线程要进来修改数据时,别的线程都得拒之门外~
比如,可以使用select…for update ~
以上这条sql语句会锁定了User表中所有符合检索条件(name=‘jay’)的记录。
本次事务提交之前,别的线程都无法修改这些记录。
使用乐观锁
乐观锁思想就是,有线程过来,先放过去修改,如果看到别的线程没修改过,就可以修改成功,如果别的线程
修改过,就修改失败或者重试。
实现方式:乐观锁一般会使用版本号机制或CAS算法实现。
可以看一下我这篇文章,主要是思路哈~
CAS乐观锁解决并发问题的一次实践
悲观锁:
悲观锁她专一且缺乏安全感了,她的心只属于当前事务,每时每刻都担心着它心爱的数据可能被别的事务修
改,所以一个事务拥有(获得)悲观锁后,其他任何事务都不能对数据进行修改啦,只能等待锁被释放才可以
执行
乐观锁:
乐观锁的“乐观情绪”体现在,它认为数据的变动不会太频繁。因此,它允许多个事务同时对数据进行变动。
实现方式:乐观锁一般会使用版本号机制或CAS算法实现。
之前转载了的这篇文章,觉得作者写得挺详细的~
图文并茂的带你彻底理解悲观锁与乐观锁
select for update 含义
select查询语句是不会加锁的,但是select for update除了有查询的作用外,还会加锁呢,而且它是悲观锁
哦。
至于加了是行锁还是表锁,这就要看是不是用了索引/主键啦。
没用索引/主键的话就是表锁,否则就是是行锁。
select for update 加锁验证
表结构:
id为主键,select for update 1270070这条记录时,再开一个事务对该记录更新,发现更新阻塞啦,其实是加
锁了。如下图:
我们再开一个事务对另外一条记录1270071更新,发现更新成功,因此,如果查询条件用了索引/主键,会加行
锁~
我们继续一路向北吧,换普通字段balance吧,发现又阻塞了。因此,没用索引/主键的话,select for update
加的就是表锁
如果按锁粒度划分,有以下3种:
有兴趣的小伙伴可以看我这篇文章,有介绍到各种锁哈:后端程序员必备:mysql数据库相关流程图/原理图
回答这个问题,可以先阐述四种隔离级别,再阐述它们的实现原理。隔离级别就是依赖锁和MVCC实现的。
可以看我这篇文章哈:一文彻底读懂MySQL事务的四大隔离级别
从锁的类别上来讲,有共享锁和排他锁。
锁兼容性如下:
基于索引来完成行锁的。
for update 可以根据条件来完成行锁锁定,并且 id 是有索引键的列,如果 id 不是索引键那么InnoDB将实行
表锁。
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。
看图形象一点,如下:
死锁有四个必要条件:互斥条件,请求和保持条件,环路等待条件,不剥夺条件。
解决死锁思路,一般就是切断环路,尽量避免并发形成环路。
有兴趣的朋友,可以看我的这篇死锁分析:
手把手教你分析Mysql死锁问题
select * from b , (select tid from a limit 50000,200) a where b.id = a .tid;
一条SQL加锁,可以分9种情况进行:
Mysql默认的事务隔离级别是可重复读(Repeatable Read)
可以看我这篇文章哈:一文彻底读懂MySQL事务的四大隔离级别
可以看我这篇文章哈:一文彻底读懂MySQL事务的四大隔离级别
事务ACID特性的实现思想
MVCC,多版本并发控制,它是通过读取历史版本的数据,来降低并发事务冲突,从而提高并发性能的一种机制。
MVCC需要关注这几个知识点:
可以看我这篇文章哈:[一文彻底读懂MySQL事务的四大隔离级别](
数据库事务(简称:事务),是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成,这些操作要么全部执行,
要么全部不执行,是一个不可分割的工作单位。
有多少种日志
innodb两种日志redo和undo。
日志的存放形式
(fwrite),然后再同步到磁盘文件( fsync)。
innodb_undo_tablespaces 参数把 undo log 存放在 ibdata之外。
事务是如何通过日志来实现的
页修改的 redo。 Redo(里面包括 undo 的修改) 一定要比数据页先持久化到磁盘。
事务没有对应的 commit 记录,那么需要用 undo把该事务的修改回滚到事务开始之前。
先看一下Mysql的逻辑架构图吧~
查询语句:
这篇文章非常不错,大家去看一下吧:
一条SQL语句在MySQL中如何执行的
为什么要使用视图?
为了提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性。
什么是视图?
视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成。
视图特点:
视图用途: 简化sql查询,提高开发效率,兼容老的表结构。
视图的常见使用场景:
游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数
据记录的结果集中每次提取一条记录的机制。
存储过程,就是一些编译好了的SQL语句,这些SQL语句代码像一个方法一样实现一些功能(对单表或多表的
增删改查),然后给这些代码块取一个名字,在用到这个功能的时候调用即可。
优点:
缺点:
触发器,指一段代码,当触发某个事件时,自动执行这些代码。
使用场景:
MySQL 数据库中有六种触发器:
分库分表方案,分库分表中间件,分库分表可能遇到的问题
分库分表方案:
常用的分库分表中间件:
分库分表可能遇到的问题
分别在各个节点上得到结果后在应用程序端进行合并。
个人觉得网上这两篇文章不错,小伙伴们可以去看一下哈:
Sharding-JDBC 是基于 JDBC 接口的扩展,是以 jar 包的形式提供轻量级服务的。
有网友推荐这篇文章:
深度认识Sharding-JDBC:做最轻量级的数据库中间层
嘻嘻,先复习一下主从复制原理吧,如图:
主从复制分了五个步骤进行:
有兴趣可以看这篇文章哈~
后端程序员必备:mysql数据库相关流程图/原理图
主从同步延迟的原因
一个服务器开放N个链接给客户端来连接的,这样有会有大并发的更新操作, 但是从服务器的里面读取binlog
的线程仅有一个,当某个SQL在从服务器上执行的时间稍长 或者由于某个SQL要进行锁表就会导致,主服务器
的SQL大量积压,未被同步到从服务器里。这就导致了主从不一致, 也就是主从延迟。
主从同步延迟的解决办法
可以看这篇文章哈~
MySQL 主从同步延迟的原因及解决办法
主从复制原理,简言之,就三步曲,如下:
如下图所示:
上图主从复制分了五个步骤进行:
步骤一:主库的更新事件(update、insert、delete)被写到binlog
步骤二:从库发起连接,连接到主库。
步骤三:此时主库创建一个binlog dump thread,把binlog的内容发送到从库。
步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的
更新事件,将更新内容写入到slave的db
主从一致性校验有多种工具 例如checksum、mysqldiff、pt-table-checksum等
可以从这几个维度回答这个问题:
有兴趣可以看这篇文章哈~
后端程序员必备:书写高质量SQL的30条建议
排查过程:
处理:
其他情况:
也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升,这种情况就需
要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等
监控的工具有很多,例如zabbix,lepus,我这里用的是lepus
这个,跟一下demo来看更刺激吧,啊哈哈
假设表A表示某企业的员工表,表B表示部门表,查询所有部门的所有员工,很容易有以下SQL:
这样写等价于:
先查询部门表B
再由部门deptId,查询A的员工
可以抽象成这样的一个循环:
显然,除了使用in,我们也可以用exists实现一样的查询功能,如下:
因为exists查询的理解就是,先执行主查询,获得数据后,再放到子查询中做条件验证,根据验证结果(true
或者false),来决定主查询的数据结果是否得意保留。
那么,这样写就等价于:
select * from A,先从A表做循环
select * from B where A.deptId = B.deptId,再从B表做循环.
同理,可以抽象成这样一个循环:
数据库最费劲的就是跟程序链接释放。假设链接了两次,每次做上百万次的数据集查询,查完就走,这样就只
做了两次;相反建立了上百万次链接,申请链接释放反复重复,这样系统就受不了了。即mysql优化原则,就
是小表驱动大表,小的数据集驱动大的数据集,从而让性能更优。
因此,我们要选择最外层循环小的,也就是,如果B的数据量小于A,适合使用in,如果B的数据量大于A,即
适合选择exists,这就是in和exists的区别。
Show status, 一些值得监控的变量值:
MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚
本初始化。
这些权限表分别user,db,table_priv,columns_priv和host。
这个权限表不受GRANT和REVOKE语句的影响。
1、如果A表TID是自增长,并且是连续的,B表的ID为索引
2、如果A表的TID不是连续的,那么就需要使用覆盖索引.TID要么是主键,要么是辅助索引,B表ID也需要有索引。
而是表示null)的计数,即某个字段值为NULL时,不统计。
delete
truncate
drop
类型
DML
DDL
DDL
回滚
可回滚
不可回滚
不可回滚
删除内容
表结构还在,删除表的全部或者一部分数据行
表结构还在,删除表中的所有数据
从数据库中删除表,所有的数据行,索引和权限也会被删除
删除速度
删除速度慢,逐行删除
删除速度快
删除速度最快
这个jar包: mysql-connector-java-5.1.18.jar
Mysql驱动程序主要帮助编程语言与 MySQL服务端进行通信,如连接、传输数据、关闭等。
连接池基本原理:
数据库连接池原理:
在内部对象池中,维护一定数量的数据库连接,并对外暴露数据库连接的获取和返回方法。
应用程序和数据库建立连接的过程:
数据库连接池好处:
有兴趣可以看这篇文章哈~
本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕,E-mail:xinmeigg88@163.com
本文链接:http://www.ksxb.net/tnews/5066.html