Mysql常见面试题(进阶知识点)

1.常用API

insert()
lower()
upper()
trim()
reverse()
length(字段名)
substring(字段名,’’,’’)
replace(字段名,‘被替换字符’,‘替换字符’)
curdate() 返回当前时间,不带时间
now() 返回当前时间,带时间
sum(可以是字段,也可以是表达式)

2.常问类型

data 年月日 YYY-MM-DD
TIME 时分秒 HH:MM:SS
datatime 年月日时分秒 YYYY-MM-DD HH:MM:SS
TIMESTAME 年月日时分秒 YYYY-MM-DD HH:MM:SS 范围小

3.MySQL常见的两种存储引擎

MyISAM与InnoDB,默认是InnoDB
区别:
1.InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件跟索引是存在一起的,必须要有主键,通过主键索引效率会很高。使用辅助索引的话需要查询两次,先查询到主键,再根据主键去查询数据
2.MyISAM是非聚集索引,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。也就是说InnoDB的叶子节点存的就是数据文件,而MyISAM的叶子节点存储的是指向数据文件的指针
3.当你去创建的时候可以去mysql文件存放位置观察,当你创建的是InnoDB引擎,会有一个.frm 跟.opt文件,当你创建的是MyISAM引擎的话会有 .frm,.MYI.MYD.opt四个文件
4.InnoDB支持事务,而MyISAM不支持事务
5.InnoDB支持外键,而MyISAM不支持
6.InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
7.InnoDB表必须有唯一索引(如主键)(用户没有指定的话会自己找/生产一个隐藏列Row_id来充当默认主键),而Myisam可以没有

4.锁的区别

  • MyISAM采用表级锁(table-level locking)。

  • InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
    表级锁和行级锁对比:

  • 表级锁:是粒度较大的锁,它锁的是整张表,实现简单,资源消耗也比较少,加锁快,不会出现死锁。触发锁冲突的概率高,并发度最低

  • 行级锁:是粒度较小的锁,只针对当前操作的行进行加锁。 行级锁能大大减少数据库操作的冲突,但加锁的开销也最大,加锁慢,会出现死锁。

5.什么是索引,索引都有哪些

概念:官方的讲,索引是帮助MySQL高效获取数据的数据结构,通俗的讲就是好比一本书的目录,能够加快查询速度。Mysql索引使用的数据结构主要有BTree索引 和 哈希索引,
InnoDB跟MyISAM都是BTree索引,不支持hash索引,memory引擎支持hash索引
优势:能够提高数据检索速度,降低IO成本
缺点:索引是会占据磁盘空间的,所以提高了查询效率,降低了更新表的效率
普通索引
唯一索引
全文索引
聚集索引
非聚集索引

6.B+树 哈希树的区别

B+树:是B-树的变体,有着比B-树更好的查询效率,B+树主要有几个特点
1.中间节点不保存数据,只用来做索引
2.叶子节点包含了全部元素信息,并且是有序的,是以自小而大的顺序链接的
3.所有中间节点元素都存在于子节点,并且是子结点中最大的元素
4.数据库的聚集索引中,叶子节点直接包含卫星数据,而非聚集索引中,叶子节点包含的是指向卫星数据的索引。
(卫星数据:索引元素所指向的数据记录)

优势:
1.B+树查询更加稳定,因为都需要遍历到叶子节点获取数据
2.因为叶子节点是有序的,所以更适用于范围查询
3.因为B+树比较矮胖,所以IO次数比较少

哈希树
1.结构简单
2.查找迅速
3.在删除的时候,不做任何结构调整,采取的是一种“见缝插针”的算法
4.最大的缺点就是 非排序性,哈希树不支持排序,没有顺序特性。

7.为什么要使用递增主键?

因为自增ID可以保证每次插入时B+索引是从右边扩展的,可以避免B+树和频繁合并和分裂,如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。

8.mysql跟oracle的区别

1.宏观上:
(1)mysql是开源的,而oracle是收费的,oralce出了问题可以找售后,mysql出了问题自己百度
(2)mysql是中小型数据库,而oralce是大型数据库
(3)oralce支持大并发
2.微观上:
(1)mysql即支持表级锁,也支持行级锁,而oracle只支持行级锁
(2)oracle的行级锁锁的是数据行,不依赖于索引,所以并发性会更好一些
(3)事务默认的隔离级别不同,mysql默认是可重复读,而oracle默认是读已提交
(4)数据安全问题,mysql默认是自动提交的,而oralce是需要手动提交的,所以如果在更新中,如果发生宕机问题,mysql可能会造成数据丢失问题,而oracle会把提交的sql操作写到在线联机日志文件中,保存到磁盘上,所以即使发生了宕机,也可以根据日志文件去恢复数据
(5)mysql的语句更加灵活,比如分页的话 mysql使用关键字limit,而oracle的分页是通过伪列和子查询完成的
(6)性能诊断方面,oracle有很多调优工具,而mysql只能根据慢查询日志去优化sql

9.大表优化

1.限定数据范围,限制不带任何条件的查询,比如查询历史订单的话限制查询一个月
2.读/写分离: 经典的数据库拆分方案,主库负责写,从库负责读
3.使用MySQL的缓存,另外对重量级、更新少的数据可以考虑使用应用级别的缓存;
4.垂直分区:根据数据库里面数据表的相关性进行拆分。 例如,用户表中既有用户的登录信息又有用户的基本信息,可以将用户表拆分成两个单独的表。
5.水平拆分:是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。水平拆分能够 支持非常大的数据量存储,应用端改造也少,但 分片事务难以解决 ,跨界点Join 性能较差,逻辑复杂。
主要实现有两种方案:
(1)客户端代理: 分片逻辑在应用端,封装在jar包中,通过修改或者封装JDBC层来实现。
(2)中间件代理: 在应用和数据中间加了一个代理层。分片逻辑统一维护在中间件服务中。比如Mycat

10.mysql缓存

my.cnf加入以下配置,重启Mysql开启查询缓存

query_cache_type=1
query_cache_size=600000

或执行sql语句开启

set global  query_cache_type=1;
set global  query_cache_size=600000;

开启查询缓存后在同样的查询条件以及数据情况下,会直接在缓存中返回结果。这里的查询条件包括查询本身、当前要查询的数据库、客户端协议版本号等一些可能影响结果的信息。因此不满足条件的查询不会命中缓存。
**缓存虽然能够提升数据库的查询性能,但是缓存同时也带来了额外的开销,每次查询后都要做一次缓存操作,失效后还要销毁。**因此,开启缓存查询要谨慎,并控制缓存空间的大小。可以通过sql_cache和sql_no_cache来控制某个查询语句是否需要缓存:

select sql_no_cache count(*) from usr;

看到最后的帅哥们记得点赞哦!还有想了解的知识点请评论,博主会更新哟

Guess you like

Origin blog.csdn.net/JavaSupeMan/article/details/117261059