MySQL面试题(一)

最全面的MySQL面试题大全-一 现在正是毕业季,很多的在校的大学生都在找工作,但是有很多的公司都会在某个方面卡大家一下,其中让很多人头疼的地方就是数据库的查询。这里我就总结了之前在有些公司面试的时候遇到的一些关于数据库查询的笔试题给大家做一个归纳。所使用的是面试题中比较经典的一个场景就是学生管理系统中所涉及到的表结构。 表结构介绍 第一张表 学生表 sid 学生id sname 学生姓名 sage 学生年龄 sex 学生性别... 阅读详情

1.什么是BufferPool?

Buffer Pool基本概念
Buffer Pool:缓冲池,简称BP。其作⽤是⽤来缓存表数据与索引数据,减 少磁盘IO操作,提升效率。
Buffer Pool由缓存数据⻚(Page) 和 对缓存数据⻚进⾏描述的控制块 组成, 控制块中存储着对应缓存⻚的所属的 表空间、数据⻚的编号、以及对应缓 存⻚在Buffer Pool中的地址等信息.
Buffer Pool默认⼤⼩是128M, 以Page⻚为单位,Page⻚默认⼤⼩16K,⽽ 控制块的⼤⼩约为数据⻚的5%,⼤ 概是800字节。
注: Buffer Pool⼤⼩为128M指的就是缓存⻚的⼤⼩,控制块则⼀般占5%,所以每次会多申请6M的内存空间⽤于存放控制块
如何判断⼀个⻚是否在BufferPool中缓存 ?
MySQl中有⼀个哈希表数据结构,它使⽤表空间号+数据⻚号,作为⼀个 key,然后缓冲⻚对应的控制块作为value。
当需要访问某个⻚的数据时,先从哈希表中根据表空间号+⻚号看看是 否存在对应的缓冲⻚。
如果有,则直接使⽤;如果没有,就从free链表中选出⼀个空闲的缓冲 ⻚,然后把磁盘中对应的⻚加载到该缓冲⻚的位置

2.InnoDB如何管理Page⻚?

Page⻚分类
BP的底层采⽤链表数据结构管理Page。在InnoDB访问表记录和索引时会 在Page⻚中缓存,以后使⽤可以减少磁盘IO操作,提升效率。
Page根据状态可以分为三种类型:
free page : 空闲page,未被使⽤
clean page:被使⽤page,数据没有被修改过
dirty page:脏⻚,被使⽤page,数据被修改过,Page⻚中数据和磁盘 的数据产⽣了不⼀致
Page⻚如何管理
针对上⾯所说的三种page类型,InnoDB通过三种链表结构来维护和管理
1. free list:表示空闲缓冲区,管理free page
free链表是把所有空闲的缓冲⻚对应的控制块作为⼀个个的节点放到⼀ 个链表中,这个链表便称之为free链表
基节点: free链表中只有⼀个基节点是不记录缓存⻚信息(单独申请空 间),它⾥⾯就存放了free链表的头节点的地址,尾节点的地址,还有 free链表⾥当前有多少个节点。
2.flush list: 表示需要刷新到磁盘的缓冲区,管理dirty page,内部page 按修改时间排序。
InnoDB引擎为了提⾼处理效率,在每次修改缓冲⻚后,并不是⽴刻把 修改刷新到磁盘上,⽽是在未来的某个时间点进⾏刷新操作. 所以需要 使⽤到flush链表存储脏⻚,凡是被修改过的缓冲⻚对应的控制块都会作 为节点加⼊到flush链表.
flush链表的结构与free链表的结构相似
3.lru list:表示正在使⽤的缓冲区,管理clean page和dirty page,缓冲区 以midpoint为基点,前⾯链表称为new列表区,存放经常访问的数据,占 63%;后⾯的链表称为old列表区,存放使⽤较少数据,占37%

 3.为什么写缓冲区,仅适用于非唯一普通索引页? 

change Buffer基本概念
Change Buffer:写缓冲区,是针对⼆级索引(辅助索引) ⻚的更新优化措施。
作⽤: 在进⾏DML操作时,如果请求的辅助索引(⼆级索引)没有在缓冲 池中时,并不会⽴刻将磁盘⻚加载到缓冲池,⽽是在CB记录缓冲变更,等 未来数据被读取时,再将数据合并恢复到BP中。
1. ChangeBuffer⽤于存储SQL变更操作,⽐如Insert/Update/Delete等 SQL语句
2. ChangeBuffer中的每个变更操作都有其对应的数据⻚,并且该数据⻚ 未加载到缓存中;
3. 当ChangeBuffer中变更操作对应的数据⻚加载到缓存中后,InnoDB会 把变更操作Merge到数据⻚上;
4. InnoDB会定期加载ChangeBuffer中操作对应的数据⻚到缓存中,并 Merge变更操作;
change buffer更新流程
写缓冲区,仅适⽤于⾮唯⼀普通索引⻚,为什么?
如果在索引设置唯⼀性,在进⾏修改时,InnoDB必须要做唯⼀性校验,因此必须查询磁盘,做⼀次IO操 作。会直接将记录查询到 BufferPool中,然后在缓冲池修改,不会在ChangeBuffer操作。

4.MySQL为什么改进LRU算法?

普通LRU算法
LRU = Least Recently Used(最近最少使⽤): 就是末尾淘汰法,新数据从 链表头部加⼊,释放空间时从末尾淘汰.
1. 当要访问某个⻚时,如果不在Buffer Pool,需要把该⻚加载到缓冲池, 并且把该缓冲⻚对应的控制块作为节点添加到LRU链表的头部。
2. 当要访问某个⻚时,如果在Buffer Pool中,则直接把该⻚对应的控制块 移动到LRU链表的头部
3. 当需要释放空间时,从最末尾淘汰
普通LRU链表的优缺点
优点
所有最近使⽤的数据都在链表表头,最近未使⽤的数据都在链表表尾,保 证热数据能最快被获取到。
缺点
如果发⽣全表扫描(⽐如:没有建⽴合适的索引 or 查询时使⽤select * 等),则有很⼤可能将真正的热数据淘汰掉.
由于MySQL中存在预读机制,很多预读的⻚都会被放到LRU链表的表 头。如果这些预读的⻚都没有⽤到的话,这样,会导致很多尾部的缓冲 ⻚很快就会被淘汰。
改进型LRU算法
改进型LRU:将链表分为new和old两个部分,加⼊元素时并不是从表头插⼊,⽽是从中间midpoint位置插⼊(就是说从磁盘中新读出的数据会放在冷 数据区的头部),如果数据很快被访问,那么page就会向new列表头部移 动,如果数据没有被访问,会逐步向old尾部移动,等待淘汰。
冷数据区的数据⻚什么时候会被转到到热数据区呢 ?
1. 如果该数据⻚在LRU链表中存在时间超过1s,就将其移动到链表头部 ( 链表指的是整个LRU链表)
2. 如果该数据⻚在LRU链表中存在的时间短于1s,其位置不变(由于全表扫 描有⼀个特点,就是它对某个⻚的频繁访问总耗时会很短)
3. 1s这个时间是由参数 innodb_old_blocks_time 控制的

5.使⽤索引⼀定可以提升效率吗?

索引就是排好序的,帮助我们进⾏快速查找的数据结构.
简单来讲,索引就是⼀种将数据库中的记录按照特殊形式存储的数据结 构。通过索引,能够显著地提⾼数据查询的效率,从⽽提升服务器的性能.
索引的优势与劣势
优点
提⾼数据检索的效率,降低数据库的IO成本
通过索引列对数据进⾏排序,降低数据排序的成本,降低了CPU的消耗
缺点
创建索引和维护索引要耗费时间,这种时间随着数据量的增加⽽增加
索引需要占物理空间,除了数据表占⽤数据空间之外,每⼀个索引 还要占⽤⼀定的物理空间
当对表中的数据进⾏增加、删除和修改的时候,索引也要动态的维 护,降低了数据的维护速度
创建索引的原则
在经常需要搜索的列上创建索引,可以加快搜索的速度;
在作为主键的列上创建索引,强制该列的唯⼀性和组织表中数据的 排列结构;
在经常⽤在连接的列上,这些列主要是⼀些外键,可以加快连接的 速度;
在经常需要根据范围进⾏搜索的列上创建索引,因为索引已经排 序,其指定的范围是连续的;
在经常需要排序的列上创建索引,因为索引已经排序,这样查询可 以利⽤索引的排序,加快排序查询时间;
在经常使⽤在WHERE⼦句中的列上⾯创建索引,加快条件的判断速 度。

6.介绍一下Page页的结构?

Page是整个InnoDB存储的最基本构件,也是InnoDB磁盘管理的最⼩单 位,与数据库相关的所有内容都存储在这种Page结构⾥。
Page分为⼏种类型,常⻅的⻚类型有数据⻚(B+tree Node)Undo⻚ (Undo Log Page)系统⻚(System Page) 事务数据⻚(Transaction System Page)等
Page 各部分说明
File Header 字段⽤于记录 Page 的头信息,其中⽐较重要的是 FIL_PAGE_PREV 和 FIL_PAGE_NEXT 字段,通过这两个字段,我们可以 找到该⻚的上⼀⻚和下⼀⻚,实际上所有⻚通过两个字段可以形成⼀条 双向链表
Page Header 字段⽤于记录 Page 的状态信息。
Infimum 和 Supremum 是两个伪⾏记录,Infimum(下确界)记录⽐ 该⻚中任何主键值都要⼩的值,Supremum (上确界)记录⽐该⻚中 任何主键值都要⼤的值,这个伪记录分别构成了⻚中记录的边界。
User Records 中存放的是实际的数据⾏记录
Free Space 中存放的是空闲空间,被删除的⾏记录会被记录成空闲空间
Page Directory 记录着与⼆叉查找相关的信息
File Trailer 存储⽤于检测数据完整性的校验和等数据。
⻚结构整体上可以分为三⼤部分,分别为通⽤部分(⽂件头、⽂件尾)、存储 记录空间、索引部分。
1. 通⽤部分 (File Header&File Trailer ) 通⽤部分 : 主要指⽂件头和⽂件尾,将⻚的内容进⾏封装,通过⽂件头和⽂ 件尾校验的CheckSum⽅式来确保⻚的传输是完整的。
其中⽐较重要的是在⽂件头中的 FIL_PAGE_PREV 和 FIL_PAGE_NEXT 字 段,通过这两个字段,我们可以找到该⻚的上⼀⻚和下⼀⻚,实际上所有 ⻚通过两个字段可以形成⼀条双向链表
2. 记录部分(User Records&Free Space)
⻚的主要作⽤是存储记录,所以“最⼩和最⼤记录”和“⽤户记录”部分占了⻚ 结构的主要空间。另外空闲空间是个灵活的部分,当有新的记录插⼊时, 会从空闲空间中进⾏分配⽤于存储新记录
3)数据⽬录部分 (Page Directory)
数据⻚中⾏记录按照主键值由⼩到⼤顺序串联成⼀个单链表(⻚中记录是以单向链表的形式进⾏存储的),且单链表的链表头为最⼩记录,链表尾为最 ⼤记录。并且为了更快速地定位到指定的⾏记录,通过 Page Directory 实现⽬录的功能,借助 Page Directory使⽤⼆分法快速找到需要查找的 ⾏记录。

7.说⼀下聚簇索引与非聚簇索引?

聚集索引与⾮聚集索引的区别是:叶节点是否存放⼀整⾏记录
聚簇索引: 将数据存储与索引放到了⼀块,索引结构的叶⼦节点保存了⾏ 数据.
⾮聚簇索引:将数据与索引分开存储,索引结构的叶⼦节点指向了数据 对应的位置.InnoDB 主键使⽤的是聚簇索引,MyISAM 不管是主键索引,还是⼆级索引 使⽤的都是⾮聚簇索引。
在InnoDB引擎中,主键索引采⽤的就是聚簇索引结构存储。
聚簇索引(聚集索引)
聚簇索引是⼀种数据存储⽅式,InnoDB的聚簇索引就是按照主键顺序 构建 B+Tree结构。B+Tree 的叶⼦节点就是⾏记录,⾏记录和主键值紧 凑地存储在⼀起。 这也意味着 InnoDB 的主键索引就是数据表本身,它 按主键顺序存放了整张表的数据,占⽤的空间就是整个表数据量的⼤ ⼩。通常说的主键索引就是聚集索引。
InnoDB的表要求必须要有聚簇索引:
如果表定义了主键,则主键索引就是聚簇索引
如果表没有定义主键,则第⼀个⾮空unique列作为聚簇索引
否则InnoDB会从建⼀个隐藏的row-id作为聚簇索引
辅助索引
InnoDB辅助索引,也叫作⼆级索引,是根据索引列构建 B+Tree结构。但在 B+Tree 的叶⼦节点中只存了索引列和主键的信息。⼆级索引占⽤ 的空间会⽐聚簇索引⼩很多, 通常创建辅助索引就是为了提升查询效 率。⼀个表InnoDB只能创建⼀个聚簇索引,但可以创建多个辅助索引。
非聚簇索引
与InnoDB表存储不同,MyISM使⽤的是⾮聚簇索引,⾮聚簇索引的两棵B+树看上去没什么不同 ,节点的结构完全⼀致只是存储的内容不同⽽已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。
表数据存储在独⽴的地⽅,这两颗B+树的叶⼦节点都使⽤⼀个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于 索引树是独⽴的,通过辅助键检索⽆需访问主键的索引树 
聚簇索引的优点
1. 当你需要取出⼀定范围内的数据时,⽤聚簇索引也⽐⽤⾮聚簇索引好。
2. 当通过聚簇索引查找⽬标数据时理论上⽐⾮聚簇索引要快,因为⾮聚簇 索引定位到对应主键时还要多⼀次⽬标记录寻址,即多⼀次I/O。
3. 使⽤覆盖索引扫描的查询可以直接使⽤⻚节点中的主键值。
聚簇索引的缺点
1. 插⼊速度严重依赖于插⼊顺序 。
2. 更新主键的代价很⾼,因为将会导致被更新的⾏移动 。
3. ⼆级索引访问需要两次索引查找,第⼀次找到主键值,第⼆次根据主键值找到行数据。

8.索引有哪几种类型?

1)普通索引
这是最基本的索引类型,基于普通字段建⽴的索引,没有任何限制。
2)唯⼀索引
与"普通索引"类似,不同的就是:索引字段的值必须唯⼀,但允许有空值 。
3)主键索引
它是⼀种特殊的唯⼀索引,不允许有空值。在创建或修改表时追加主键约束即可,每个表只能有⼀个主键。
4)复合索引
⽤户可以在多个列上建⽴索引,这种索引叫做组复合索引(组合索引)。复合索引可以代替多个单⼀索引,相⽐多个单⼀索引复合索引所 需的开销更小。
复合索引使⽤注意事项:
何时使⽤复合索引,要根据where条件建索引,注意不要过多使⽤ 索引,过多使⽤会对更新操作效率有很⼤影响。
如果表已经建⽴了(col1,col2),就没有必要再单独建⽴(col1);如果现在有(col1)索引,如果查询需要col1和col2条件可以建⽴ (col1,col2)复合索引,对于查询有⼀定提⾼。
5) 全⽂索引
查询操作在数据量⽐较少时,可以使⽤like模糊查询,但是对于⼤量的⽂本 数据检索,效率很低。如果使⽤全⽂索引,查询速度会⽐like快很多倍。
在MySQL 5.6 以前的版本,只有MyISAM存储引擎⽀持全⽂索引,从 MySQL 5.6开始MyISAM和InnoDB存储引擎均⽀持。
全⽂索引⽅式有⾃然语⾔检索 IN NATURAL LANGUAGE MODE和布尔检索IN BOOLEAN MODE两种和常⽤的like模糊查询不同,全⽂索引有⾃⼰的语法格式,使⽤ match和 against 关键字,例如
全⽂索引使⽤注意事项:
全⽂索引必须在字符串、⽂本字段上建⽴。
全⽂索引字段值必须在最⼩字符和最⼤字符之间的才会有效。
(innodb:3-84;myisam:4-84)

9.介绍⼀下最佳左前缀法则?

1)最佳左前缀法则
最佳左前缀法则: 如果创建的是联合索引,就要遵循该法则. 使⽤索引时, where后⾯的条件需要从索引的最左前列开始使⽤,并且不能跳过索引中的 列使⽤。
场景1: 按照索引字段顺序使⽤,三个字段都使⽤了索引,没有问题。
场景2: 直接跳过user_name使⽤索引字段,索引⽆效,未使⽤到索引。
场景3: 不按照创建联合索引的顺序,使⽤索引
where后⾯查询条件顺序是 user_age、user_level、user_name与我们创建的索引顺序 user_name、user_age、user_level不⼀致, 为什么还是使⽤了索引,原因是因为MySql底层优化器对其进⾏了优化。
最佳左前缀底层原理
MySQL创建联合索引的规则是: ⾸先会对联合索引最左边的字段进⾏排序( 例⼦中是 user_name ), 在第⼀个字段的基础之上再对第⼆个字段进行排序 ( 例⼦中是 user_age ) .
最佳左前缀原则其实是和B+树的结构有关系, 最左字段肯定是有序的, 第⼆个字段则是⽆序的(联合索引的排序⽅式是: 先按照第⼀个字段进⾏排序,如果第⼀个字段相等再根据第⼆个字段排序). 所以如果直接使⽤第⼆ 个字段 user_age 通常是使⽤不到索引的.

10.什么是索引下推?

索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,⽤于优化查询。
需求: 查询users表中 "名字第⼀个字是张,年龄为10岁的所有记录"。
根据最左前缀法则,该语句在搜索索引树的时候,只能匹配到名字第⼀个 字是‘张’的记录,接下来是怎么处理的呢?当然就是从该记录开始,逐个回 表,到主键索引上找出相应的记录,再⽐对 age 这个字段的值是否符合。
图1: 在 (name,age) 索引⾥⾯特意去掉了 age 的值,这个过程 InnoDB 并 不会去看 age 的值,只是按顺序把“name 第⼀个字是’张’”的记录⼀条条取 出来回表。因此,需要回表 4 次
MySQL 5.6引⼊了索引下推优化,可以在索引遍历过程中,对索引中包含 的字段先做判断,过滤掉不符合条件的记录,减少回表次数。
图2: InnoDB 在 (name,age) 索引内部就判断了 age 是否等于 10,对于不 等于 10 的记录,直接判断并跳过,减少回表次数.
总结
如果没有索引下推优化(或称ICP优化),当进⾏索引查询时,⾸先根据索 引来查找记录,然后再根据where条件来过滤记录;
在⽀持ICP优化后,MySQL会在取出索引的同时,判断是否可以进⾏where条件过滤再进⾏索引查询,也就是说提前执⾏where的部分过滤操作,在 某些场景下,可以大大减少回表次数,从⽽提升整体性能。

11.什么是自适应哈希索引?

⾃适应Hash索引(Adatptive Hash Index,内部简称AHI)是InnoDB的三 ⼤特性之⼀,还有两个是 Buffer Pool简称BP、双写缓冲区(Doublewrite Buffer)。
1、⾃适应即我们不需要⾃⼰处理,当InnoDB引擎根据查询统计发现某⼀ 查询满⾜hash索引的数据结构特点,就会给其建⽴⼀个hash索引;
2、hash索引底层的数据结构是散列表(Hash表),其数据特点就是⽐较 适合在内存中使⽤,⾃适应Hash索引存在于InnoDB架构中的缓存中(不存 在于磁盘架构中),⻅下⾯的InnoDB架构图。
3、⾃适应hash索引只适合搜索等值的查询,如select * from table where index_col='xxx',⽽对于其他查找类型,如范围查找,是不能使⽤的;
Adaptive Hash Index是针对B+树Search Path的优化,因此所有会涉及到 Search Path的操作,均可使⽤此Hash索引进⾏优化.
根据索引键值(前缀)快速定位到叶⼦节点满⾜条件记录的Offset,减少了 B+树Search Path的代价,将B+树从Root节点⾄Leaf节点的路径定位,优 化为Hash Index的快速查询。
InnoDB的⾃适应Hash索引是默认开启的,可以通过配置下⾯的参数设置进行关闭。
⾃适应Hash索引使⽤分⽚进⾏实现的,分⽚数可以使⽤配置参数设置:

12.为什么LIKE以%开头索引会失效?

like查询为范围查询,%出现在左边,则索引失效。%出现在右边索引未失效.
场景1: 两边都有% 或者 字段左边有%,索引都会失效。
场景2: 字段右边有%,索引⽣效
解决%出现在左边索引失效的⽅法,使⽤覆盖索引
对⽐场景1可以知道, 通过使⽤覆盖索引 type = index ,并且 extra = Using index ,从全表扫描变成了全索引扫描.
like 失效的原因
1. %号在右: 由于B+树的索引顺序,是按照⾸字⺟的⼤⼩进⾏排序,%号在右的匹配⼜是匹配⾸字⺟。所以可以在B+树上进⾏有序的查找,查找⾸字⺟符合要求的数据。所以有些时候可以⽤到索引.
2. %号在左: 是匹配字符串尾部的数据,我们上⾯说了排序规则,尾部的 字⺟是没有顺序的,所以不能按照索引顺序查询,就⽤不到索引.
3. 两个%%号: 这个是查询任意位置的字⺟满⾜条件即可,只有⾸字⺟是进⾏索引排序的,其他位置的字⺟都是相对⽆序的,所以查找任意位置的字⺟是⽤不上索引的.

13.自增还是UUID?数据库主键的类型该如何选择?

auto_increment的优点:
1. 字段⻓度较uuid⼩很多,可以是bigint甚⾄是int类型,这对检索的性能 会有所影响。
2. 在写的⽅⾯,因为是⾃增的,所以主键是趋势⾃增的,也就是说新增的 数据永远在后⾯,这点对于性能有很⼤的提升。
3. 数据库⾃动编号,速度快,⽽且是增量增⻓,按顺序存放,对于检索⾮ 常有利。
4. 数字型,占⽤空间⼩,易排序,在程序中传递也⽅便。
auto_increment的缺点:
1. 由于是⾃增,很容易通过⽹络爬⾍知晓当前系统的业务量。
2. ⾼并发的情况下,竞争⾃增锁会降低数据库的吞吐能⼒。
3. 数据迁移或分库分表场景下,⾃增⽅式不再适⽤。
UUID的优点:
1. 不会冲突。进⾏数据拆分、合并存储的时候,能保证主键全局的唯⼀性
2. 可以在应⽤层⽣成,提⾼数据库吞吐能⼒
UUID的缺点:
1. 影响插⼊速度, 并且造成硬盘使⽤率低。与⾃增相⽐,最⼤的缺陷就是 随机io,下⾯我们会去具体解释
2. 字符串类型相⽐整数类型肯定更消耗空间,⽽且会⽐整数类型操作慢。
uuid 和⾃增 id 的索引结构对⽐
1、使⽤⾃增 id 的内部结构
⾃增的主键的值是顺序的,所以 InnoDB 把每⼀条记录都存储在⼀条记录的后⾯。
当达到⻚⾯的最⼤填充因⼦时候(InnoDB 默认的最⼤填充因⼦是⻚⼤ ⼩的 15/16,会留出 1/16 的空间留作以后的修改)。
下⼀条记录就会写⼊新的⻚中,⼀旦数据按照这种顺序的⽅式加载,主 键⻚就会近乎于顺序的记录填满,提升了⻚⾯的最⼤填充率,不会有页的浪费。
新插⼊的⾏⼀定会在原有的最⼤数据⾏下⼀⾏,MySQL 定位和寻址很 快,不会为计算新⾏的位置⽽做出额外的消耗。减少了⻚分裂和碎⽚的 产⽣。
2、使⽤ uuid 的索引内部结构
插⼊UUID: 新的记录可能会插⼊之前记录的中间,因此需要移动之前的记录
被写满已经刷新到磁盘上的⻚可能会被重新读取
因为 uuid 相对顺序的⾃增 id 来说是毫⽆规律可⾔的,新⾏的值不⼀定要⽐之前的主键的值要⼤,所以 innodb⽆法做到总是把新⾏插⼊到索引的最 后,⽽是需要为新⾏寻找新的合适的位置从⽽来分配新的空间。
这个过程需要做很多额外的操作,数据的毫⽆顺序会导致数据分布散乱,将会导致以下的问题:
1. 写⼊的⽬标⻚很可能已经刷新到磁盘上并且从缓存上移除,或者还没有被加载到缓存中,innodb 在插⼊之前不得不先找到并从磁盘读取⽬标 ⻚到内存中,这将导致⼤量的随机 IO。
2. 因为写⼊是乱序的,innodb 不得不频繁的做⻚分裂操作,以便为新的⾏分配空间,⻚分裂导致移动⼤量的数据,⼀次插⼊最少需要修改三个⻚以上。
3. 由于频繁的⻚分裂,⻚会变得稀疏并被不规则的填充,最终会导致数据会有碎⽚。
4. 在把随机值(uuid 和雪花 id)载⼊到聚簇索引(InnoDB 默认的索引类型)以后,有时候会需要做⼀次 OPTIMEIZE TABLE 来重建表并优化⻚的填充,这将⼜需要⼀定的时间消耗。
结论:使⽤ InnoDB 应该尽可能的按主键的⾃增顺序插⼊,并且尽可能使⽤单调的增加的聚簇键的值来插⼊新⾏。如果是分库分表场景下,分布式主键ID的⽣成⽅案 优先选择雪花算法⽣成全局唯⼀主键(雪花算法⽣成的主键在⼀定程度上是有序的)。

14.InnoDB与MyISAM的区别?

InnoDB和MyISAM是使⽤MySQL时最常⽤的两种引擎类型,我们重点来看下两者区别。
事务和外键
InnoDB⽀持事务和外键,具有安全性和完整性,适合⼤量insert或update操作
MyISAM不⽀持事务和外键,它提供⾼速存储和检索,适合⼤量的select查询操作
锁机制
InnoDB⽀持⾏级锁,锁定指定记录。基于索引来加锁实现。
MyISAM⽀持表级锁,锁定整张表。
索引结构
InnoDB使⽤聚集索引(聚簇索引),索引和记录在⼀起存储,既缓存索引,也缓存记录。
MyISAM使⽤⾮聚集索引(⾮聚簇索引),索引和记录分开。
并发处理能⼒
MyISAM使⽤表锁,会导致写操作并发率低,读之间并不阻塞,读写阻塞。
InnoDB读写阻塞可以与隔离级别有关,可以采⽤多版本并发控制(MVCC)来⽀持⾼并发
存储⽂件
InnoDB表对应两个⽂件,⼀个.frm表结构⽂件,⼀个.ibd数据⽂件。InnoDB表最⼤⽀持64TB;
MyISAM表对应三个⽂件,⼀个.frm表结构⽂件,⼀个MYD表数据问件,⼀个.MYI索引⽂件。从MySQL5.0开始默认限制是256TB。
MyISAM 适⽤场景
1.不需要事务⽀持(不⽀持)
2.并发相对较低(锁定机制问题)
3..数据修改相对较少,以读为主
4.数据⼀致性要求不⾼
InnoDB 适⽤场景
1.需要事务⽀持(具有较好的事务特性)
2.⾏级锁定对⾼并发有很好的适应能⼒
3.数据更新较为频繁的场景
4.数据⼀致性要求较⾼
5.硬件设备内存较⼤,可以利⽤InnoDB较好的缓存能⼒来提⾼内存利⽤率,减少磁盘IO
两种引擎该如何选择?
1.是否需要事务?有,InnoDB
2.是否存在并发修改?有,InnoDB
3.是否追求快速查询,且数据修改少?是,MyISAM
4.在绝⼤多数情况下,推荐使⽤InnoDB
扩展资料:各个存储引擎特性对⽐

15.B树和B+树的区别是什么?

 
1)B-Tree介绍
B-Tree是⼀种平衡的多路查找树,B树允许⼀个节点存放多个数据. 这样可以 在尽可能减少树的深度的同时,存放更多的数据(把瘦⾼的树变的矮胖).
B-Tree中所有节点的⼦树个数的最⼤值称为B-Tree的阶,⽤m表示.⼀颗m阶 的B树,如果不为空,就必须满⾜以下条件.
m阶的B-Tree满⾜以下条件:
1. 每个节点最多拥有m-1个关键字(根节点除外),也就是m个⼦树
2. 根节点⾄少有两个⼦树(可以没有⼦树,有就必须是两个)
3. 分⽀节点⾄少有(m/2)颗⼦树 (除去根节点和叶⼦节点其他都是分⽀节点)
4. 所有叶⼦节点都在同⼀层,并且以升序排序
什么是B-Tree的阶 ?
所有节点中,节点【60,70,90】拥有的⼦节点数⽬最多,四个⼦节点(灰 ⾊节点),所以上⾯的B-Tree为4阶B树。
B-Tree结构存储索引的特点
为了描述B-Tree⾸先定义⼀条记录为⼀个键值对[key, data] ,key为记录的 键值,对应表中的主键值(聚簇索引),data为⼀⾏记录中除主键外的数据。 对于不同的记录,key值互不相同
索引值和data数据分布在整棵树结构中
白色块部分是指针,存储着⼦节点的地址信息。
每个节点可以存放多个索引值及对应的data数据树节点中的多个索引值从左到右升序排列
B-Tree的查找操作
B-Tree的每个节点的元素可以视为⼀次I/O读取,树的⾼度表示最多的I/O 次数,在相同数量的总元素个数下,每个节点的元素个数越多,⾼度越低,查询所需的I/O次数越少.
B-Tree总结
优点: B树可以在内部节点存储键值和相关记录数据,因此把频繁访问的数据放在靠近根节点的位置将⼤⼤提⾼热点数据的查询效率。
缺点: B树中每个节点不仅包含数据的key值,还有data数据. 所以当data数据较⼤时,会导致每个节点存储的key值减少,并且导致B树的层数变⾼.增加查询时的IO次数.
使⽤场景: B树主要应⽤于⽂件系统以及部分数据库索引,如 MongoDB,⼤部分关系型数据库索引则是使⽤B+树实现
2)B+Tree
B+Tree是在B-Tree基础上的⼀种优化,使其更适合实现存储索引结构, InnoDB存储引擎就是⽤B+Tree实现其索引结构。
B+Tree的特征
1.⾮叶⼦节点只存储键值信息.
2.所有叶⼦节点之间都有⼀个链指针.
3.数据记录都存放在叶⼦节点中.
B+Tree的优势
1. B+Tree是B Tree的变种,B Tree能解决的问题,B+Tree也能够解决 (降低树的⾼度,增⼤节点存储数据量)
2. B+Tree扫库和扫表能⼒更强,如果我们要根据索引去进⾏数据表的扫描,对BTree进⾏扫描,需要把整棵树遍历⼀遍,⽽B+Tree只需要遍历他的所有叶⼦节点即可(叶⼦节点之间有引⽤)。
3. B+Tree磁盘读写能⼒更强,他的根节点和⽀节点不保存数据区,所有根节点和⽀节点同样⼤⼩的情况下,保存的关键字要⽐B Tree要多。⽽叶⼦节点不保存⼦节点引⽤。所以,B+Tree读写⼀次磁盘加载的关键字⽐B Tree更多。
4. B+Tree排序能⼒更强,如上⾯的图中可以看出,B+Tree天然具有排序功能。
5. B+Tree查询效率更加稳定,每次查询数据,查询IO次数⼀定是稳定的。当然这个每个⼈的理解都不同,因为在B Tree如果根节点命中直接返回,确实效率更⾼。

因为篇幅有限,资料已整理成文档,查看下方名片获取!

mysql面试题走一波 2019mysql面试题案例分享 1、现有login_logs日志表,用来记录用户登录的信息情况,字段有:uid,create_time(时间格式为:yyyy-mm-dd i:m:s) 用sql语句查出,2017-06-... 阅读详情

相关推荐

MySQL数据库面试题(一)(MySQL Database Interview Questions I)

MySQL数据库面试题涵盖了从基础知识到高级概念的广泛内容,包括数据库设计、事务处理、查询优化、存储引擎等多个方面。本章详细介绍MySQL数据库面试题希望对大家有帮助。

Linux运维老纪的博客 1232

MySQL面试题一

两轮面试完之后本来以为可以谈薪资了 结果HR可能是觉得还没问SQL题 出其不意地在微信上扔了四道SQL题目过来 题目如下: 我发你几道测试题,就是日常工作中基础的应用,你看看熟练吗?可以吗 现有表app_login,包含3个字段(uid、day、isguest),各uid在每一天可能有任意条记录 现求9月份(1至30日)中 1.每个uid在每天各有多少条记录 2.每个uid在...

星辰大数据的博客 2721

Mysql常用面试题(一)

表结构: CREATE TABLE `white_user_new` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(1000) NOT NULL COMMENT '姓名', `sex` int(11) DEFAULT NULL COMMENT '性别,0是女生,1是男生', `cre...

Top5软件工程硕士,先后在京东、字节从事多年Java后端开发、实时和离线大数据开发 831

MySql 常用面试题 2024最新面试题(一)

使用函数。事务是一组有序的数据库操作,具有原子性、一致性、隔离性和持久性。事务回滚是将已完成的对数据库的更新操作撤销,使数据库回到事务开始前的状态。存储过程是一组预编译的SQL语句;可以使用命令对象调用存储过程。

qq_15363475的博客 2631

从Podfile到分享成功:ShareSDK小红书模块集成全流程实战(附视频分享代码)

本文详细介绍了iOS应用如何通过ShareSDK集成小红书分享功能的全流程,包括环境配置、SDK初始化、图片和视频分享实现,以及常见问题排查和性能优化策略。特别针对视频分享这一高频需求场景,提供了完整的代码示例和实战技巧,帮助开发者快速实现社交分享功能。

weixin_42540248的博客 227

手把手教你解决Windows 10网络驱动器无法访问问题(附详细排查步骤)

本文详细指导Windows 10用户解决网络驱动器无法访问的常见问题。通过从现象快速定位到系统排查,提供了从检查网络连通性、修复凭据权限到调整高级设置的完整步骤,特别是针对“找不到网络路径”等错误,帮助用户高效恢复对共享资源的访问。

weixin_29233857的博客 519

mysql的面试题一

本面试题是根据尚硅谷-宋红康老师的mysql讲课 第一章认识 说说你了解的常见的数据库 Oracle , mysql ,sql Server , DB2 , PGSQL, Redis,MongoDB 2.谈谈你对Mysql历史,特点的理解 历史: 由瑞典的Mysql AB公司创立,1995年开发出的MySQL 2008年,MySQL被SUN公司收购 2009年,Oracle收购SUN公司,进而Oracle就获取了MySQL 2016年,MySQL8.0.0版本推出 特点: 开源的、关系型的数据库

sinat_41902940的博客 1602

SAP ABAP MIGO增强实战:自定义页签与字段的完整实现指南

本文详细介绍了SAP ABAP中MIGO增强的实战指南,包括自定义页签与字段的完整实现步骤。通过BADI增强技术,开发者可以快速满足企业个性化需求,如添加供应商批次号等特殊字段。文章涵盖数据存储结构设计、BADI框架实现、核心方法编写及数据持久化方案,帮助用户高效完成MIGO屏幕增强开发。

study的专栏 774

MySQL架构面试题系列-MySQL面试宝典(一)

MySQL架构面试题系列-MySQL面试宝典(一)

qq_33705071的博客 336

SOI技术实战:从晶圆结构到芯片性能提升的完整解析

本文深入解析SOI(Silicon on Insulator)技术如何通过独特的三明治晶圆结构提升芯片性能,涵盖从220nm SOI层设计到7nm节点的工艺挑战。详细探讨了埋氧层的绝缘优势、性能提升的物理机制,以及AMD处理器和5G射频中的实战应用,为半导体行业提供关键技术洞见。

wdx0123456的博客 962

4.4 直流无刷电机(BLDC):控制器硬件设计

摘要 本文详细阐述了直流无刷电机(BLDC)控制器的硬件设计要点。控制器硬件主要包括微处理器单元、功率驱动模块、信号检测电路、通信接口和电源管理模块。在微处理器选型方面,分析了ARM Cortex-M系列、DSP等架构的适用场景,并对比了不同处理器的性能参数。功率驱动模块设计重点包括栅极驱动电路、逆变桥热管理和电流保护机制。信号检测部分介绍了位置传感器接口和模拟信号调理技术。此外,还讨论了通信接口设计、电源管理方案以及硬件布局与EMC设计规范。最后强调了硬件测试验证的重要性,包括故障注入测试等验证方法。整体

技术工作者 185

mysql 面试题(一)

一条或多条sql语句集合,有以下一些特点:存储过程能实现较快的执行速度。存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。存储过程可被作为一种安全机制来充分利用。存储过程能够减少网络流量delimiter 分隔符beginsql语句end 分隔符delimiter;--还原分隔符,为了不影响后面的语句的使用--默认的分隔符是;但是为了能在整个存储过程中重用,因此一般需要自定义分隔符(除\外)--查询存储过程,可以不适用like进行过滤--删除存储过程。

butterfly_onfly的专栏 1753

Qt应用软件【协议篇】自定义协议处理串口半包贴包

Qt串口数据,半包,贴包,丢包数据处理

小鱼酱的博客 1215

Java 面试题【MySQL 篇 一】

使用了联合索引却不符合最左前缀索引上使用了运算:比如索引上使用了函数:比如like 的随意使用:比如name = like '%飞'or 的随意使用随意的字段类型使用【隐式转换】表中两个不同字段进行比较使用了!order by 后面不是 主键 或者覆盖索引。

飞询 1028

数据分析!Python爬虫爬取B站UP主数据并分析涨粉规律(附可视化图表)

爬取更多UP主:扩充列表,增加需要分析的UP主UID数量爬取更多作品:修改的参数,增加每个UP主的作品爬取页数新增分析维度:在类中添加方法,可分析发布时间(如定时发布对涨粉的影响)、内容标签(如游戏/知识区涨粉差异)优化可视化样式:调整方法中的图表类型、颜色、标题等,适配个人展示需求播放量与粉丝数强正相关:从相关性热力图可看出,总播放量与粉丝数的相关系数通常在0.8以上,说明曝光量是涨粉的核心基础作品数量存在“边际效应”

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1228

【数据集】CMIP6气候模式数据下载

简介CMIP6及其气候模式数据下载

WW、forever的博客 9360

千锋2019MySQL高级面试题(一)

qianfeng_dashuju的博客 211

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Mysql面试题一

这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能。在更新操作的时候,该事务的版本号在原来的基础上加1,所以版本号为2。先将要更新的这条数据标记为已删除,并且删除的版本号是当前事务的版本号,然后插入一行新的记录。在删除操作的时候,该事务的版本号在原来的基础上加1,所以版本号为3删除时,将当前版本号作为删除版本号。

yyyx_111111的博客 1121

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MySQL(一)——MySQL基础和部分面试题

答:事务是一系列的数据库操作,是数据库的基本单位事务的四个特性:1)原子性。要么全部执行,要么全部不执行2)一致性。事务的执行使得数据库从一种正确状态转化为另一种正确状态3)隔离型。事务正确提交之前,不允许把该事务对数据的改变提供给其他事务4)持久性。事务提交后,结果永远保存于数据库中。

pingguocu3的博客 884

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

MySQL面试题(一)

一、MyISAM 存储引擎与 InnoDB 存储引擎的区别 二、b-tree 和 b+tree 的区别 1、B-树的关键字、索引和记录是放在一起的, B+树的非叶子节点中只有关键字和指向下一个节点的索引,记录只放在叶子节点中。 2、在 B-树中,越靠近根节点的记录查找时间越快,只要找到关键字即可确定记录的存在。而 B+树中每个记录的查找时间基本是一样的,都需要从根节点走到叶子节点,而且在叶子节点...

a1786742005的博客 254

最常问的MySQL面试题集合(一)

除了基础题部分,小编收集整理的MySQL面试题还包括如下知识点或题型: MySQL高性能索引 SQL语句 MySQL查询优化 MySQL高扩展高可用 MySQL安全性 为了避免收藏不看,让大家更有耐心看下去,印象更深刻些,民工哥将分几次分别发布这些内容,欢迎持续关注公众号后续文章分享。 问题1:char、varchar的区别是什么? varchar是变长而char的长度是固定的。...

weixin_34089871的博客 446

MySQL 面试题(一)

MySQL 面试题(一) 基础知识 三大范式 第一范式:每个列都不可再拆分 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分 第三范式:在第二范式的基础上,非主键列只依赖与主键,不依赖于其他非主键 MySQL 有关权限的表 这些表由 mysql_install_db 脚本初始化user 权限表:记录允许连接到服务器的用户账号,权限是全局级的db 权限表:记录各个账号在各个数据库上的操作权限table_priv 权限表:记录数据表级的操作权限cloumns_priv

R先生专栏 1742

【分享经典MySQL面试题一】

-- 【1. 取得每个部门最高薪水的人员名称】 -- 第一步:取得每个部门最高薪水【按照部门分组求最大值】 select deptno ,max(sal) as maxsal from emp group by deptno; -- 第二步:将上面的查询结果当作临时表题,T表和emp e表进行表连接, -- 条件:t.deptno=e.deptno and t.maxsal=e.sal; se...

future277809183的专栏 762

MySQL——必考面试题 ①

由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制。MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。此外,新版的MySQL中对row级别也做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录。权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。

qq_53142796的博客 183
上一篇: 漫画:为什么键盘以QWER排列,而不是ABCD?
下一篇: 扫盲Kafka?看这一篇就够了!
程序员职业指南
博客等级 码龄4年 2138粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值