目录
5. 你们数据库是否支持emoji表情存储,如果不支持,如何操作?
7. mysql中int(20)和char(20)以及varchar(20)的区别
10. MySQL中DATETIME和TIMESTAMP的区别
1. Mysql 的内连接、左连接、右连接有什么区别?(已整合)
2. Mysql的binlog有几种录入格式?分别有什么区别?
2. 数据库索引的原理,为什么要用 B+树,为什么不用二叉树?
5. Hash索引和B+树区别是什么?你在设计索引是怎么抉择的?
12. B树和B+树的区别,数据库为什么使用B+树而不是B树?
14. B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据?
1. SQL优化的一般步骤是什么,怎么看执行计划(explain),如何理解其中各个字段的含义。
4. 关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?
4. select for update有什么含义,会锁表还是锁行还是其他。
7. 按照锁的粒度分,数据库锁有哪些呢?锁机制与InnoDB锁算法
1. 事务的隔离级别有哪些?MySQL的默认隔离级别是什么?
2. 一条sql执行过长的时间,你如何优化,从哪些方面入手?
十一、视图 & 游标 & 存储过程 & 存储函数 & 触发器等
2. 数据库中间件了解过吗,sharding jdbc,mycat?
6. 你是否做过主从一致性校验,如果有,怎么做的,如果没有,你打算怎么做?
4. 你是如何监控你们的数据库的?你们的慢日志都是怎么查询的?
5. 一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录
6. count(1)、count(*) 与 count(列名) 的区别?
一、MySQL 数据类型
1. 数据库存储日期格式时,如何考虑时区转换问题?
- datetime类型适合用来记录数据的原始的创建时间,修改记录中其他字段的值,datetime字段的值不会改
变,除非手动修改它。
- timestamp类型适合用来记录数据的最后修改时间,只要修改了记录中其他字段的值,timestamp字段的
值都会被自动更新。
如何考虑时区转换问题/看一下这个吧:数据库存储日期格式时,如何考虑时区转换问题?
2. Blob和text有什么区别?
- Blob用于存储二进制数据,而Text用于存储大字符串。
- Blob值被视为二进制字符串(字节字符串),它们没有字符集,并且排序和比较基于列值中的字节的数值。
- text值被视为非二进制字符串(字符字符串)。它们有一个字符集,并根据字符集的排序规则对值进行排
序和比较。
3. mysql里记录货币用什么字段类型比较好?
- 货币在数据库中MySQL常用Decimal和Numric类型表示,这两种类型被MySQL实现为同样的类型。他们
被用于保存与金钱有关的数据。
- salary DECIMAL(9,2),9(precision)代表将被用于存储值的总的小数位数,而2(scale)代表将被用于存储
小数点后的位数。存储在salary列中的值的范围是从-9999999.99到9999999.99。
- DECIMAL和NUMERIC值作为字符串存储,而不是作为二进制浮点数,以便保存那些值的小数精度。
4. MySQL如何获取当前日期?
SELECT CURRENT_DATE();
5. 你们数据库是否支持emoji表情存储,如果不支持,如何操作?
更换字符集utf8-->utf8mb4
6. varchar(50)中50的涵义
- 字段最多存放 50 个字符
- 如 varchar(50) 和 varchar(200) 存储 "jay" 字符串所占空间是一样的,后者在排序时会消耗更多内存
7. mysql中int(20)和char(20)以及varchar(20)的区别
- int(20) 表示字段是int类型,显示长度是 20
- char(20)表示字段是固定长度字符串,长度为 20
- varchar(20) 表示字段是可变长度字符串,长度为 20
8. 字段为什么要求定义为not null?
null值会占用更多的字节,并且null有很多坑的。
9. 如果要存储用户的密码散列,应该使用什么字段进行存储?
密码散列,盐,用户身份证号等固定长度的字符串,应该使用char而不是varchar来存储,这样可以节省空间
且提高检索效率。
10. MySQL中DATETIME和TIMESTAMP的区别
存储精度都为秒
区别:
- DATETIME 的日期范围是 1001——9999 年;TIMESTAMP 的时间范围是 1970——2038 年
- DATETIME 存储时间与时区无关;TIMESTAMP 存储时间与时区有关,显示的值也依赖于时区
- DATETIME 的存储空间为 8 字节;TIMESTAMP 的存储空间为 4 字节
- DATETIME 的默认值为 null;TIMESTAMP 的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP)
11. MySQL中TEXT数据类型的最大长度
- TINYTEXT:256 bytes
- TEXT:65,535 bytes(64kb)
- MEDIUMTEXT:16,777,215 bytes(16MB)
- LONGTEXT:4,294,967,295 bytes(4GB)
二、关联查询
1. Mysql 的内连接、左连接、右连接有什么区别?(已整合)
- Inner join 内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集
- left join 在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。
- right join 在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。
2. 什么是内连接、外连接、交叉连接、笛卡尔积呢?
- 内连接(inner join):取得两张表中满足存在连接匹配关系的记录。
- 外连接(outer join):取得两张表中满足存在连接匹配关系的记录,以及某张表(或两张表)中不满足
匹配关系的记录。
- 交叉连接(cross join):显示两张表所有记录一一对应,没有匹配关系进行筛选,也被称为:笛卡尔积。
3. 谈谈六种关联查询,使用场景。
- 交叉连接
- 内连接
- 外连接
- 联合查询
- 全连接
- 交叉连接
4. UNION与UNION ALL的区别?
1. 显示结果不同
union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果集全部显示出来
2. 对重复结果的处理不同
union all是直接连接,取到的是所有值,记录可能有的重复;union是取唯一值,记录没有重复。
所以union在进行表链接后会筛选掉重复的记录,union all不会去除重复记录。
3. 对排序的处理不同
union会按照字段的顺序进行排序;union all 只是将两个结果集合并后就返回。
结论:从效率上讲,union all要比 union快的多,所以如果确定合并的两个结果集中没有重复且不
需要排序就用Union all。
三、主键问题
1. 如何选择合适的分布式主键方案呢?
- 数据库自增长序列或字段。
- UUID。
- Redis生成ID
- Twitter的snowflake算法
- 利用zookeeper生成唯一ID
- MongoDB的ObjectId
2. 数据库自增主键可能遇到什么问题
- 使用自增主键对数据库做分库分表,可能出现诸如主键重复等的问题。
解决方案的话,简单点的话可以考虑使用UUID哈
- 自增主键会产生表锁,从而引发问题
- 自增主键可能用完问题。
3. 主键使用自增ID还是UUID,为什么?
如果是单机的话,选择自增ID;如果是分布式系统,优先考虑UUID吧,但还是最好自己公司有一套分布式唯
一ID生产方案吧。
- 自增ID:数据存储空间小,查询效率高。但是如果数据量过大,会超出自增长的值范围,多库合并,也有可
能有问题。
- uuid:适合大量数据的插入和更新操作,但是它无序的,插入数据效率慢,占用空间大。
4. mysql自增主键用完了怎么办?
自增主键一般用int类型,一般达不到最大值,可以考虑提前分库分表的。
四、MySQL架构
1. 说说MySQL 的基础架构图
Mysql逻辑架构图主要分三层:
- 第一层负责连接处理,授权认证,安全等等
- 第二层负责编译并优化SQL
- 第三层是存储引擎。
2. Mysql的binlog有几种录入格式?分别有什么区别?
有三种格式哈,statement,row和mixed。
- statement,每一条会修改数据的sql都会记录在binlog中。不需要记录每一行的变化,减少了binlog日
志量,节约了IO,提高性能。由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同
时还有一些使用了函数之类的语句无法被记录复制。
- row,不记录sql语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,基本是可以
全部记下来但是由于很多操作,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息
太多,日志量太大。
- mixed,一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row。
3. InnoDB引擎的4大特性,了解过吗
- 插入缓冲(insert buffer)
- 二次写(double write)
- 自适应哈希索引(ahi)
- 预读(read ahead)
五、存储引擎
1. InnoDB与MyISAM的区别
- InnoDB支持事务,MyISAM不支持事务
- InnoDB支持外键,MyISAM不支持外键
- InnoDB 支持 MVCC(多版本并发控制),MyISAM 不支持
- select count(*) from table时,MyISAM更快,因为它有一个变量保存了整个表的总行数,可以直接读取,InnoDB就需要全表扫描。
- Innodb不支持全文索引,而MyISAM支持全文索引(5.7以后的InnoDB也支持全文索引)
- InnoDB支持表、行级锁,而MyISAM支持表级锁。
- InnoDB表必须有主键,而MyISAM可以没有主键
- Innodb表需要更多的内存和存储,而MyISAM可被压缩,存储空间较小,。
- Innodb按主键大小有序插入,MyISAM记录插入顺序是,按记录插入顺序保存。
- InnoDB 存储引擎提供了具有提交、回滚、崩溃恢复能力的事务安全,与 MyISAM 比 InnoDB 写的效率差一些,并且会占用更多的磁盘空间以保留数据和索引
2. InnoDB引擎中的索引策略,了解过吗?
- 覆盖索引
- 最左前缀原则
- 索引下推
索引下推优化是 MySQL 5.6 引入的, 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不
满足条件的记录,减少回表次数。
这篇文章非常不错,大家去看一下吧:聊一聊 InnoDB 引擎中的这些索引策略
六、索引问题
1. MySQL 索引使用有哪些注意事项呢?
可以从三个维度回答这个问题:索引哪些情况会失效,索引不适合哪些场景,索引规则
索引哪些情况会失效
- 查询条件包含or,可能导致索引失效
- 如何字段类型是字符串,where时一定用引号括起来,否则索引失效
- like通配符可能导致索引失效。
- 联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。
- 在索引列上使用mysql的内置函数,索引失效。
- 对索引列运算(如,+、-、*、/),索引失效。
- 索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效。
- 索引字段上使用is null, is not null,可能导致索引失效。
- 左连接查询或者右连接查询查询关联的字段编码格式不一样,可能导致索引失效。
- mysql估计使用全表扫描要比使用索引快,则不使用索引。
索引不适合哪些场景
- 数据量少的不适合加索引
- 更新比较频繁的也不适合加索引
- 区分度低的字段不适合加索引(如性别)
索引的一些潜规则
- 覆盖索引
- 回表
- 索引数据结构(B+树)
- 最左前缀原则
- 索引下推
2. 数据库索引的原理,为什么要用 B+树,为什么不用二叉树?
可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数,为什么不
是二叉树,为什么不是平衡二叉树,为什么不是B树,而偏偏是B+树呢?
为什么不是一般二叉树?
如果二叉树特殊化为一个链表,相当于全表扫描。平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体
的查找速度也更快。
为什么不是平衡二叉树呢?
我们知道,在内存比在磁盘的数据,查询效率快得多。如果树这种数据结构作为索引,那我们每查找一次数据
就需要从磁盘中读取一个节点,也就是我们说的一个磁盘块,但是平衡二叉树可是每个节点只存储一个键值和
数据的,如果是B树,可以存储更多的节点数据,树的高度也会降低,因此读取磁盘的次数就降下来啦,查询
效率就快啦。
那为什么不是B树而是B+树呢?
- B+树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。innodb中
页的默认大小是16KB,如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)
就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也
会更快。
- B+树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的,链表连着的。那么B+树使得范围
查找,排序查找,分组查找以及去重查找变得异常简单。
可以看这篇文章哈:再有人问你为什么MySQL用B+树做索引,就把这篇文章发给她
3. 聚集索引与非聚集索引的区别
- 一个表中只能拥有一个聚集索引,而非聚集索引一个表可以存在多个。
- 聚集索引,索引中键值的逻辑顺序决定了表中相应行的物理顺序;非聚集索引,索引中索引的逻辑顺序与
磁盘上行的物理存储顺序不同。
- 索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非
聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。
- 聚集索引:物理存储按照索引排序;非聚集索引:物理存储不按照索引排序;
何时使用聚集索引或非聚集索引?
4. 如何写sql能够有效的使用到复合索引
复合索引,也叫组合索引,用户可以在多个列上建立索引,这种索引叫做复合索引。
当我们创建一个组合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是
最左匹配原则。
select * from table where k1=A AND k2=B AND k3=D
有关于复合索引,我们需要关注查询Sql条件的顺序,确保最左匹配原则有效,同时可以删除不必要的冗余索
引。
5. Hash索引和B+树区别是什么?你在设计索引是怎么抉择的?
- B+树可以进行范围查询,Hash索引不能。
- B+树支持联合索引的最左侧原则,Hash索引不支持。
- B+树支持order by排序,Hash索引不支持。
- Hash索引在等值查询上比B+树效率更高。
- B+树使用like 进行模糊查询的时候,like后面(比如%开头)的话可以起到优化的作用,Hash索引根本无
法进行模糊查询。