目录
4.数据库删除操作中的 delete、drop、 truncate 区别在哪?
11.列设置为AUTO INCREMENT时,如果在表中达到最大值,会发生什么情况?
30.什么是事务的隔离级别?MySQL的默认隔离级别是什么?
44.大表怎么优化?某个表有近千万数据,CRUD比较慢,如何优化?
1.InnoDB和 MyISAM 区别
- InnoDB支持事务,MyISAM不支持
- InnoDB支持外键,而MyISAM不支持
- InnoDB是聚集索引,MyISAM是非聚集索引
-Innodb不支持全文索引,而MyISAM支持全文索引
-InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
-InnoDB表必须有唯一索引(如主键),而Myisam可以没有
2.innodb引擎的4大特性
插入缓冲
二次写
自适应哈希索引
预读
3.什么是聚簇索引,非聚簇索引
聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针,非聚簇索引访问数据总是需要二次查找
4.数据库删除操作中的 delete、drop、 truncate 区别在哪?
-delete 删除部分表数据
-drop 删除表数据及结构
-truncate 删除表数据,但保留结构
5.MySQL中有哪几种锁?
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
6.LIKE 声明中的%和_是什么意思?
%对应于 0 个或更多字符,_只是 LIKE 语句中的一个字符。
7.实践中如何优化 MySQL?
最好是按照以下顺序优化:
SQL 语句及索引的优化
数据库表结构的优化
系统配置的优化
硬件的优化
8.优化数据库的方法?
-选取最适用的字段属性,减少定义字段宽度,把字段设置 NOTNULL,例如’省份’、’性别’最好适用枚举类型ENUM
-使用连接(JOIN)来代替子查询
-适用联合(UNION)来代替手动创建的临时表
-事务处理
-适当建立索引
-优化查询语句
9.通用SQL函数?
CONCAT(A, B): 连接两个字符串值以创建单个字符串输出。
FORMAT(X, D): 格式化数字 X 到 D 有效数字。
CURRDATE():CURRTIME():返回当前日期或时间。
NOW():将当前日期和时间作为一个值返回。
MONTH():DAY(),YEAR(),WEEK(),WEEKDAY() :从日期值中提取给定数据。
HOUR():MINUTE(),SECOND() : 从时间值中提取给定数据。
DATEDIFF(A,B):确定两个日期之间的差异,通常用于计算年龄
SUBTIMES(A,B):确定两次之间的差异。
FROMDAYS(INT): 将整数天数转换为日期值。
10.myisamchk是用来做什么的?
压缩 MyISAM 表
11.列设置为AUTO INCREMENT时,如果在表中达到最大值,会发生什么情况?
它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用
12.什么情况下设置了索引但无法使用?
以“%”开头的 LIKE 语句
OR 语句前后没有同时使用索引
数据类型出现隐式转化(如 varchar 不加单引号的话可能会自动转换为 int 型)
13.SQL注入漏洞产生的原因?如何防止?
原因:不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET 提交一些sql语句正常执行。
防止SQL注入的方式:
sql预编译(preparedstatement)
使用正则表达式进行过滤
在jsp中对sql输入进行过滤
利用工具进行sql注入检测
在mybatis中使用#{}占位符
14.什么是存储过程?用什么来调用?
存储过程是一个预编译的 SQL 语句,就是说只需创建一次,以后在该程序中就可以调用多次。
可以用一个命令对象来调用存储过程。
15.什么情况下不宜建立索引?
对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。
16.为数据表建立索引的原则有哪些?
在频繁使用的、用以缩小查询范围的字段上建立索引。
在频繁使用的、需要排序的字段上建立索引
适合索引的列是出现在where子句中的列
不要过度索引
使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度
17.索引对数据库系统的负面影响是什么?
创建索引和维护索引需要耗费时间
索引需要占用物理空间
索引也要维护
18.什么是视图?
是一种虚拟的表,具有和物理表相同的功能,对视图的修改不影响基本表。
19.视图的优点?
视图能够简化用户的操作
视图使用户能以多种角度看待同一数据;
视图为数据库提供逻辑独立性;
视图能够对机密数据提供安全保护。
20.mysql有关权限的表都有哪几个
user,db,table_priv,columns_priv
用户信息,各个账号操作权限,表操作权限,列操作权限
21.什么是索引?
索引是一种数据结构。数据库索引,是一个排序的数据结构,可快速查询、更新数据库表中数据。
22.索引有哪几种类型?
主键索引
唯一索引
普通索引
全文索引
23.索引的数据结构
在MySQL中使用较多的索引有Hash索引,B+树索引等
InnoDB存储引擎的默认索引实现为:B+树索引
对于哈希索引来说,底层的数据结构就是哈希表,在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快
B+tree性质:
1.)n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引。
2.)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身自小而大顺序链接。
3.)所有的非终端结点可以看成是索引部分
4.)B+ 树中,数据对象的插入和删除仅在叶节点上进行。
24.什么是最左前缀原则?
所谓最左前缀原则就是联合索引中先要看第一列,在第一列满足的条件下再看左边第二列,以此类推。
最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配
25.B树和B+树的区别
-
在B树中,你可以将键和值存放在内部节点和叶子节点;但在B+树中,内部节点都是键,没有值,叶子节点同时存放键和值。
-
B+树的叶子节点有一条链相连,而B树的叶子节点各自独立。
26.使用B树的好处
B树可以在内部节点同时存储键和值,把频繁访问的数据放在靠近根节点的地方可提高热点数据的查询效率。
27.使用B+树的好处
B+树的内部节点只存放键,不存放值,一次读取,可以在内存页中获取更多的键,有利于更快地缩小查找范围。
B+树的叶节点由一条链相连,因此,当需要进行一次全数据遍历的时候,B+树只需要使用O(logN)时间找到最小的一个节点,然后通过链进行O(N)的顺序遍历即可。而B树则需要对树的每一层进行遍历需要花费更多的时间
28.Hash索引和B+树有什么区别
hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据。
B+树底层实现是多路平衡查找树。对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据。
那么可以看出他们有以下的不同:
hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询。
b+树可以,他是二叉查找树
hash索引不支持模糊查询以及多列索引的最左前缀匹配。
hash索引任何时候都避免不了回表查询数据
hash索引虽然在等值查询上较快,但是不稳定,而B+树的查询效率比较稳
因此,在大多数情况下,直接选择B+树索引可以获得稳定且较好的查询速度。而不需要使用hash索引。
29.数据库为什么使用B+树而不是B树
B树只适合随机检索,而B+树同时支持随机检索和顺序检索;
B+树空间利用率更高,可减少I/O次数,磁盘读写代价更低。
B+树的查询效率更加稳定。B树搜索有可能会在非叶子结点结束,越靠近根节点的记录查找时间越短,只要找到关键字即可确定记录的存在,其性能等价于在关键字全集内做一次二分查找。
B+树的叶子节点使用指针顺序连接在一起,只要遍历叶子节点就可以实现整棵树的遍历,而B树不支持这样的操作。
增删文件(节点)时,效率更高。
30.什么是事务的隔离级别?MySQL的默认隔离级别是什么?
默认:可重复度
31.从锁的类别上分MySQL都有哪些锁呢?
从锁的类别上来讲,有共享锁和排他锁。
共享锁: 当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。
排他锁: 当用户要进行数据的写入时,对数据加上排他锁。排他锁只可以加一个,他和其他的排他锁,共享锁都相斥。
32.数据库的乐观锁和悲观锁是什么?怎么实现的?
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
实现方式:使用数据库中的锁机制
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
实现方式:乐一般会使用版本号机制或CAS算法实现。
33.什么是游标?
游标是存放SQL语句的执行结果
34.什么是触发器?触发器的使用场景有哪些?
触发器是指一段代码,当触发某个事件时,自动执行这些代码。
使用场景
实时监控某张表中的某个字段的更改而需要做出相应的处理。
35.MySQL中都有哪些触发器?
- Before Insert
- After Insert
- Before Update
- After Update
- Before Delete
- After Delete
36.SQL语句主要分为哪几类
数据定义语言DDL(Data Ddefinition Language):CREATE
数据查询语言DQL(Data Query Language):SELECT
数据操纵语言DML(Data Manipulation Language):INSERT,UPDATE,DELETE
数据控制功能DCL(Data Control Language):COMMIT,ROLLBACK
37.超键、候选键、主键、外键分别是什么?
超键:在关系中能唯一标识元组的属性称为超键。超键包含候选键和主键。
候选键:是最小超键,即没有冗余元素的超键。
主键:数据库表中对储存数据对象予以唯一标识的数据列。一个数据列只能有一个主键,且主键不能为空值(Null)。
外键:在一个表中存在的另一个表的主键称此表的外键。
38.SQL 约束有哪几种?
NOT NULL:非空
UNIQUE: 字段内容不能重复
PRIMARY KEY: 主键
FOREIGN KEY: 外键
CHECK: 字段的值范围。
39.SQL的生命周期?
-
服务器与数据库建立连接
-
数据库进程拿到请求sql
-
解析并生成执行计划,执行
-
读取数据到内存并进行处理
-
发送结果到客户端
-
关掉连接,释放资源
40.大表数据查询,怎么优化
优化sql语句+索引;
加缓存 redis;
主从复制,读写分离;
垂直拆分,分成多个表
水平切分,为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,将数据定位到限定的表上去查,而不是扫描全部的表;
41.超大分页怎么处理?
其实主要是靠缓存,可预测性的提前查到内容,缓存至redis中,直接返回即可.
42.慢查询日志
开启慢查询日志:slow_query_log
43.
为什么要优化数据库
- 数据库的中的数据会越来越多,处理时间会相应变慢
- 数据是存放在磁盘上的,读写速度无法和内存相比
- 系统的吞吐量瓶颈往往出现在数据库的访问速度上
44.大表怎么优化?某个表有近千万数据,CRUD比较慢,如何优化?
- 限定数据的范围: 比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内。;
- 读/写分离: 经典的数据库拆分方案,主库负责写,从库负责读;
- 缓存: 使用MySQL的缓存
45.分库分表了是怎么做的?
垂直分表和水平分表
垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。
水平分区:保持数据表结构不变,对存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。
46.MySQL的复制原理
主从复制:将主数据库中的操作传输到从数据库上,然后将这些日志重新执行;从而使得从数据库的数据与主数据库保持一致。
主从复制的作用
- 主数据库出现问题,可以切换到从数据库。
- 读写分离。
- 方便备份。
MySQL主从复制解决的问题
- 数据分布:在不同地理位置分布数据备份
- 负载均衡:降低单个服务器的压力
- 高可用和故障切换
- 可用高版本的MySQL作为从库
47.四中隔离级别底层原理
READ UNCOMMITTED:读不加锁,写加锁
READ COMMITTED:写数据时,使用排它锁, 读取数据使用了MVCC机制。
通过MVCC获取当前数据的最新快照,不加任何锁,也无视任何锁
REPEATABLE READ:一次事务中只在第一次select时生成版本,后续的查询都是在这个版本上进行
SERIALISABLE:所有读写都互斥
48.快照
快照是数据存储的某一时刻的状态记录
将虚拟硬盘文件锁定,不再更改。之后新建一个文件,之后所有更改都放到新建的文件中,读取时,优先读取这个新建的文件中的,没有的话在读取锁定中的数据。
49.mysql如何保证主从一致性
1 半同步复制
主库发生增删改操作的时候,会等从库及时复制了并且通知了主库, 才会把这个操作叫做成功.
2 数据库中间件
如果有了数据库中间件,所有的数据库请求都走中间件,这个主从不一致的问题可以这么解决:
中间件就是给个同步时间,给你同步,在同步时间内,所有的请求都落在主库
设一个key记录着一次写的数据,然后设置一个同步时间,如果在这个时间内,有一个读请求,看看对应的key有没有相关数据,有的话,说明数据近期发生过写事件,这样key的数据就继续读主库,否则就读从库
50.分库分表
为什么分
1.业务拆分,将一个大的业务拆分成多个小服务
2.应对高并发
3.数据隔离
怎么分
常见的是采用一个分布式发号器实现如:美团的leaf
常见的分表算法有:
- 区域法:根据id划分区域,例如:0-1000一个表,1001-2000一个表
- 哈希法:根据id哈希后取余数划分,例如:hash(id)%256==1,就存入第1号表中
分表后产生的问题
查询问题
哈希法分表后会产生一个新的问题?
在原来order表查询既有根据orderid查询,也有根据userId查询,如果只是根据orderid进行分表,通过orderid搜索没有任何问题,因为可以根据orderid的值定位到具体数据在那张表中,但是如果根据userid查询,那么无法定位表,势必得全库全表搜索一下,执行效率十分低下。
业务双写
两套分库分表同样存在分布式事务问题,多存储一份数据,资源浪费
分库分表后Join无法使用了
51.select count(*)和select count(1)的区别
COUNT(1)
和 COUNT(*)
表示的是查询表的行数,
COUNT(列名/字段)
表示的是查询值不为NULL的行数。
COUNT(1)和COUNT(*):包括对NULL的统计
COUNT(字段):不包括对NULL的统计
假如表沒有主键(Primary key), 那么count(1)比count(*)快,
如果有主键的話,那主键作为count的条件时候count(主键)最快
如果你的表只有一个字段的话那count(*)就是最快的