🎉来一波C#.NET面试中,数据库方面的高频问题🎉
🥳希望你别再被面试官追着“砍”了🎉
🥳祝你一面而就🎉
1.事务使用场景有哪些?什么是原子性?什么是一致性?
使用场景有 保证多个insert,update,delete操作要么全都执行成功(Committed),要么全都不执行(Rollback)。
原子性:事务被视为不可分割的最小单元,所有操作要么全部执行成功,要么失败回滚(即还原到事务开始前的状态,就像这个事务从来没有执行过一样)
一致性:在成功提交或失败回滚之后以及正在进行的事务期间,数据库始终保持一致的状态。如果正在多个表之间更新相关数据,那么查询将看到所有旧值或所有新值,而不会一部分是新值,一部分是旧值。
2.什么是事务的隔离性?隔离级别有哪些?
隔离性:并发执行的事务彼此无法看到对方的中间状态。
隔离级别有哪些:读未提交、读已提交、可重复度、可串行化;
SQLServer默认级别是读已提交;MySQL默认的级别是可重复读,见下:
3.索引如何分类的?有什么区别?
MySql 创建索引语法:
create index [索引名] on 表名(列名1, 列名2, ...); --普通索引
create UNIQUE index [索引名] on 表名(列名); -- 唯一索引
create CLUSTERED index [索引名] ON 表名(列名)。-- 创建聚簇索引
MySQL的索引分三类:单列索引(普通索引、唯一索引、主键索引)、组合索引、全文索引
单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引。
(1)普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹是为了查询数据更快一点。
(2)唯一索引:索引列中的值必须是唯一的,但是允许为空值。
(3)主键索引:是一种特殊的唯一索引,不允许有空值。(主键约束,就是一个主键索引)。
组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合——最左匹配原则。
全文索引:在大量数据中,通过其中的某个关键字,就能找到该字段所属的记录行。全文索引在开发中很少用,因为其占用很大的物理空间和降低了记录修改性。
4.索引按照存储方式分类?有什么区别?
(1)聚集索引:一张表中只能有唯一一个聚集索引,存储记录是物理上连续,索引的键值逻辑顺序决定了表数据行的物理存储顺序。生活中的例子:新华字典按拼音索引
(2)非聚集索引:一个表可以存在多个,物理存储不按照索引排序;非聚集索引就是普通索引,仅仅只是对数据列创建相应的索引,不影响整个表的物理存储顺序。生活中的例子:手机联系人A-Z索引
5.什么是最左匹配原则?
SQL的最左匹配原则(Leftmost Prefix Rule)是指在使用联合索引(Composite Index)进行查询时,索引的最左边的列被优先使用,以尽可能地减少搜索的行数。
需要注意的是,如果查询条件中包含了联合索引的某个列,但不是最左边的列,那么这个索引也无法被使用。因为索引只能在联合索引列的最左边生效。
使用最左匹配原则,可以提高查询的效率,减少不必要的扫描和筛选。因此,在设计索引时,应该优先考虑使用最常用的查询条件作为联合索引的最左边列。
6.什么是SQL执行计划?怎么通过执行计划查看SQL的查询效率?
解释select语句如何在数据库执行的、相关表是怎么连接、连接的次序、有哪些索引和索引使用情况、每个表的扫描数据
MySQL中查看执行计划需要用到关键字EXPLAIN,将EXPLAIN放在SQL语句的前面,如:
创建索引后,再去分析,可以看到他已经命中索引了:
7.什么是审计字段?为什么数据库表设计里要加入审计字段?
审计字段即记录数据的创建人、创建时间、修改人、修改时间、删除人、删除时间的字段、体现在每一张数据库表中。为了减少代码量需要设置一套通用的方法。
作用:记录日志
8.分库分表分为哪些类型?
垂直分表:垂直分表在日常开发和设计中比较常见,通俗的说法叫做“大表拆小表”,拆分是基于关系型数据库中的“列”(字段)进行的;
垂直分库:按照业务模块来划分出不同的数据库,而不是像早期一样将所有的数据表都放到同一个数据库中
水平分库分表:水平分库分表与上面讲到的水平分表的思想相同,唯一不同的就是将这些拆分出来的表保存在不同的数据库中;
水平分表:水平分表也称为横向分表,比较容易理解,就是将表中不同的数据行按照一定规律(比如 按时间分、或按照主键值得范围)分布到不同的数据库表中;
9.SQL中有哪些连接查询?分别描述?
SQL中连接查询分内、外连接,外连接分左连接、右连接和完全外连接,它们的功能与视图差不多。其中左右连接查询是相对应的,即把连接类型和左表、右表互换位置就可得到相同的结果集。
- 内连接(inner join 或 join)
内连接是等值连接,它使用“=、>、<、<>”等运算符根据每个表共有的列的值匹配两个表中的行外连接
- 左连接(left join 或 left outer join)
左连接又称左向外连接,查询的结果集包括 SQL语句 中左表的所有行,右表中匹配的行。如果左表的某行在右表中没有匹配行,则用空值表示
- 右连接(right join 或 right outer join)
右连接也成右向外连接,查询的结果集包括SQL语句中右表的所有行,左表中匹配的行。如果右表的某行在左表中没有匹配的行,则用空值表示
- 完全外连接(full join 或 full outer join)
完全外连接,查询的结果集包括SQL语句中左表和右表的所有行。如果某行在另一个表中没有匹配行时,则用空值表示。
10.SQL中创建视图怎么创建?视图的作用?
作用:
-
视图隐藏了底层的表结构,简化了数据访问操作,客户端不再需要知道底层表的结构及其之间的关系。
-
视图提供了一个统一访问数据的接口。
-
加强了安全性,使用户只能看到视图所显示的数据。
-
视图还可以被嵌套,一个视图中可以嵌套另一个视图。
创建语法 :
create view <视图名> as <select语句>
例子:
-- 创建视图(虚拟的表)
create view v_dict as select text,sort from DictionaryItem;
-- 查询视图
select * from v_dict where text='产品分类';
-- 视图也可以嵌套
create view v_dict2 as select text from v_dict;
11.SQL中having和where的作用,有什么区别?
HAVING和WHERE都是SQL中用于筛选数据的关键字,但它们之间存在一些区别:
WHERE用于在查询之前过滤行,即从表中选择满足指定条件的行。
HAVING用于在GROUP BY语句之后筛选组,即对数据进行分组后,筛选满足条件的组。
所以,WHERE用于过滤行,HAVING用于过滤组,它们的作用和使用场景不同。
同时,HAVING只能在GROUP BY语句中使用,而WHERE可以用于任何SQL语句。
select UserName, count(*) as userCount
from Abpusers
where UserName='张三'
GROUP BY UserName
HAVING userCount > 1
12.delete table和truncate table的作用?区别是什么?
delete与truncate都可以用来删除表中数据 。
delete删除表中数据之后再次插入数据索引会接着之前的,而truncate删除表中后重新插入数据索引会从初始大小开始。
delete在删除数据后会将删除操作作为事务存储在日志中,这样就可以进行事务回滚,而truncate则不可以事务回滚。
13.存储过程有什么优缺点?
存储过程是预先定义在数据库中的一组SQL语句,
create PROCEDURE p_getUser(
IN _UserName varchar(20)
)
BEGIN
-- 存储过程的内容,一组sql语句,还要一些逻辑处理等
select * from users where UserName=_UserName;
END;
其具有以下优点和缺点:
优点:
-
提高性能:存储过程已经在数据库中编译和优化,因此在执行时比单个SQL语句更快,可以提高系统性能。
-
提高安全性:可以通过存储过程来限制对数据库的访问权限,从而提高系统安全性。
-
提高可维护性:存储过程可以被多次调用,避免了重复编写SQL语句的问题,同时可以通过修改存储过程来实现对数据的更改。
-
支持事务处理:存储过程可以在一个事务中执行多个SQL语句,从而确保数据库的数据完整性和一致性。
缺点:
-
难以调试:存储过程通常在服务器端执行,因此调试时比较困难。
-
不便于维护:存储过程可能比单个SQL语句更加复杂,因此编写和维护时需要更多的精力和时间。
-
特定于数据库:每个数据库系统都有自己的存储过程语法和规范,因此需要考虑数据库迁移时的兼容性问题。
-
可能过度使用:如果存储过程过多,会增加数据库的复杂性,从而使维护和管理变得更加困难。
14. MS SQL Server中的分页语句有几种写法?
SQL Server的分页与MySQL的分页的不同,MySql的分页直接是用limit (pageIndex-1),pageSize就可以完成,但是SQL Server 并没有limit关键字,只有类似limit的top关键字。所以分页起来比较麻烦。
分享三种方法:利用max(主键);利用row_number关键字,offset/fetch next关键字
第1种方法:offset /fetch next(2012版本及以上才有)--推荐使用
-- 用法
select * from 表名 order by 排序字段
offset ((@pageIndex-1)*@pageSize) rows
fetch next @pageSize rows only;
-- 分页查询第2页,每页有10条记录
select * from student
order by sno
offset 10 rows
fetch next 10 rows only ;
第2种方法:利用row_number关键字
SELECT TOP 页大小 *
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber, * FROM table名
) as A
WHERE RowNumber > (页大小*页数)
第3种方法:利用max(主键)
先top前11条行记录,然后利用max(id)得到最大的id,之后再重新再这个表查询前10条,不过要加上条件,where id>max(id)
-- 分页查询第2页,每页有10条记录
select top 10 * from student
where id>= (select max(id)
from (select top 11 id
from student
order by id asc) temp_max_ids)
order by id;
15.MySql分页语句怎么写?传什么参数?
MySQL中使用LIMIT实现分页:
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
使用格式: LIMIT [位置偏移量],行数
第一个"位置偏移量"参数指明MySQL以哪一行开始显示,是一个可选参数,如果不指定"位置偏移量",就会默认从表中的第一条记录开始(第一条记录的位置偏移量为0,第二条记录的位置偏移量为0,以此类推)显示;
第二个参数"行数",指明返回的记录条数。
举例:
-- 需求1: 每页显示20条记录,此时显示第一页
SELECT employee_id,last_name
FROM employees
LIMIT 0,20;
-- 需求2: 每页显示20条记录,此时显示第二页
SELECT employee_id,last_name
FROM employees
LIMIT 20,20;
16.用过哪些非关系型数据库?用在什么地方?
非关系型数据库(NoSQL)有:MongoDB、Redis等
Redis是一种基于内存的非关系型数据库,通常用于快速读写和高并发场景下的数据存储和处理,比如缓存、会话存储、消息队列、计数器、实时数据处理和分布式锁等。
Redis还支持持久化和复制等特性,保证数据的可靠性和高可用性。它还提供了一些高级功能,如发布-订阅、事务处理和Lua脚本执行等,使得应用程序可以更灵活地处理数据和实现业务逻辑。
17.SQL中用过哪些分组函数?分别做什么用?
在 SQL 中常用的分组函数包括以下几种:
COUNT:用于统计某个字段的行数,可以用于计算一个表中某一列的总数。
SUM:用于计算某个字段的总和,可以用于计算某一列的数值总和。
AVG:用于计算某个字段的平均值,可以用于计算某一列的平均数。
MAX:用于找出某个字段的最大值,可以用于找出某一列中的最大值。
MIN:用于找出某个字段的最小值,可以用于找出某一列中的最小值。
这些分组函数通常与 GROUP BY 子句一起使用,以便将结果按照指定的列进行分组,并对每个分组应用相应的函数,从而得出每个分组的统计结果。
18.怎么才能排查索引是否被命中?
要检查 SQL 查询语句是否使用了索引,可以通过以下简化步骤:
使用 EXPLAIN 关键字查看查询语句的执行计划。(请看第6题-执行计划)
在执行计划中查看是否有 "Using Index" 或 "Using Index Condition" 字样,表示索引被命中。
如果执行计划中有 "Using Where" 或 "Using Temporary" 字样,表示索引未被命中,需要优化查询语句或重新设计索引。Type字段为“All”表示全表扫描
可以使用 MySQL 工具分析查询语句和索引使用情况,以进一步确认索引是否被命中。
19.MySQL数据库有哪些引擎?
InnoDB存储引擎:给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎,处理巨 大数据 量的最大性能设计;
支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键
MyISAM存储引擎:MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务。
MEMORY存储引擎:EMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问
MERGE存储引擎:把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询
20.SQL注入攻击是什么?怎么防止?
SQL 注入就是在用户输入的字符串中加入 SQL 语句,如果在设计不良的程序中忽略了检查,那么这些注入进去的 SQL 语句就会被数据库服务器误认为是正常的 SQL 语句而运行,攻击者就可以执行计划外的命令或访问未被授权的数据。
避免SQL注入
-
1. 过滤输入内容,校验字符串
-
2. 参数化查询
-
3. 安全测试、安全审计
21.在SQL Server中SQL语句后面加with(nolock)的作用?
要提升SQL的查询效能,一般来说大家会以建立索引(index)为第一考虑。
其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善在线大量查询的环境中数据集被LOCK的现象藉此改善查询的效能。
加了WITH (NOLOCK)的SQL查询效率会得到提升,可以用于inner join 语句。会产生脏读 只适用与select查询语句
select * from users with(nolock);
22.数据库中锁是什么?行级锁和表级锁分别是什么?
锁是一种用于控制并发访问的机制。数据库中的锁可以分为行级锁和表级锁两种类型。
行级锁是对数据表中的一行数据进行锁定,其他事务无法同时修改该行数据;
表级锁是对整个数据表进行锁定,其他事务无法同时访问该表中的任何数据。
行级锁可以提高并发性,但会增加锁的粒度,影响并发访问效率;
表级锁简化了锁管理,但会降低并发性。具体使用时,需要根据具体情况进行选择。
23.什么是数据库作业?数据库作业的使用场景是什么?
数据库作业(Database Job)是指在数据库中执行的一系列任务或操作。这些任务可以包括数据的导入、导出、清理、更新、备份和恢复等操作。数据库作业可以大大提高数据处理的效率和精确度,同时减少人工干预的成本和错误率。
数据库作业的使用场景非常广泛,特别是在需要处理大量数据的企业和组织中。比如,数据库作业可以自动执行数据备份和恢复任务、数据清理和更新任务、数据导入和导出任务、数据库监控和维护任务、数据分析和报表生成任务等。
这些任务可以通过定时调度或者触发器来自动执行,从而保证数据的安全和可靠性,并提高数据处理的效率和准确性。
24.select * into语句和insert into ... select ... 语句是什么作用?
select into 和 insert into select都是用来复制表的语句。
select into 要求目标表不存在,因为在插入时会自动创建;
insert into 目标表 select... from 原始表。要求目标表存在;
select into 的性能要比insert into select 更高。
25. 哪些情况下会使索引失效?
索引失效是指数据库查询不再使用索引进行优化,而是执行全表扫描,从而导致查询性能下降。
以下是一些可能导致索引失效的情况:
-
使用函数或表达式作为查询条件
-
对索引列进行了类型转换
-
使用“NOT”或“!=”操作符
-
在查询语句中使用了“OR”操作符 (如果有or查询,应该改用Union查询)
-
数据库中的数据分布不均匀
-
对索引列进行了更新或删除
-
索引本身被删除或损坏
需要注意的是,这些情况只是导致索引失效的一些常见原因,实际情况可能更加复杂,因此在数据库设计和查询优化时,需要认真考虑索引的使用情况和可能出现的问题,以保证查询性能和效率。
26. 在索引的列上使用函数会使索引失效,那有什么办法可以使索引不失效?
在索引列上使用函数使得索引失效的是常见的索引失效原因之一,因此尽可能的避免在索引列上使用函数。
尽管可以使用基于函数的索引来解决索引失效的问题,但如此一来带来的比如磁盘空间的占用以及列上过多的索引导致DML性能的下降。
解决办法:改造SQL语句,使用函数索引。
27.创建索引有哪些遵循原则?谈谈你的经验?
1.选择唯一性索引
唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。
例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。
2.为经常需要排序、分组和联合操作的字段建立索引
经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。如果为其建立索引,可以有效地避免排序操作。
3.为常作为查询条件的字段建立索引
如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。
4.限制索引的数目
索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。
5.尽量使用数据量少的索引
如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR(100)类型的字段进行全文检索需要的时间肯定要比对CHAR(10)类型的字段需要的时间要多。
6.尽量使用前缀来索引
如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。
7.删除不再使用或者很少使用的索引
表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。
8.最左前缀匹配原则,非常重要的原则。
mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a 1=”” and=”” b=”2” c=”“> 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
9.=和in可以乱序。
比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式
10.尽量选择区分度高的列作为索引。
区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就 是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条 记录
11.索引列不能参与计算,保持列“干净”。
比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本 太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);
12.尽量的扩展索引,不要新建索引。
比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可注意:选择索引的最终目的是为了使查询的速度变快。上面给出的原则是最基本的准则,但不能拘泥于上面的准则。读者要在以后的学习和工作中进行不断的实践。根据应用的实际情况进行分析和判断,选择最合适的索引方式。
28.什么是ER图,作用是什么?怎么画ER图?
实体关系图又称E-R模型图,是一种提供了实体,属性和联系的方法,用来描述现实世界的概念模型。
实体关系图一般包含的元素有:实体(方框表示),联系(菱形表示),属性(椭圆表示),联系(直线表示)
29.MySQL和MS SQL Server有什么区别?
1、开源
MySQL是一个开源关系数据库管理系统(RDBMS);而SQL Server不是开源的,是商业的。
2、程序
MySQL主要用C和C ++编程语言编程。SQL Server主要用C++编程,但在C语言中也有一些部分。
3、平台
SQL Server仅支持Linux和Windows平台,主要用于.Net应用程序或Windows项目。与之相比,MySQL支持许多平台,它主要用于PHP项目或应用程序。
4、语法
MySQL语法有点复杂;SQL Server语法更简单易用。
举例简单说明语法区别:
分页语句 MySQL limit,SQL Server 可以使用 row_number() over()
执行语句的时候 MySQL必须以;号结尾,SQL Server 没有要求
主键自增的时候 MySQL是 auto_increment关键字,SQL Server 是 identity关键字
5、执行查询
在MySQL中,一旦执行了查询,就无法在中途取消查询。在SQL Server中,可以在执行后的中途取消查询。
6、存储引擎
在MySQL中,有多个存储引擎使用(InnoDB和MyISAM引擎)。InnoDB是一种流行的存储引擎,支持事务操作的。
SQL Server只能使用一个或只有一个存储引擎。
30.SQL里面 on跟where的区别
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用 left join 时,on 和 where 条件的区别如下:
1、on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
在on、where这两个都可以加条件的子句中,on是最先执行,where次之。有时候如果这先后顺序不影响中间结果的话,那最终结果是相同的。但因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的。
31.数据库怎么设计?三大范式是什么?
数据库设计是确定数据的组织结构和存储方式的过程。遵循三大范式可以减少数据冗余、提高效率和维护性,保证数据完整性和一致性。
三大范式是数据库设计的三个标准,分别是第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。
- 第一范式:属性不可分割,即
每个属性都是不可分割的原子项
。(实体的属性即表中的列); - 第二范式:在满足第一范式基础上,要求非主键字段完全依赖于主键;
- 第三范式:在满足第二范式基础上,非主键字段不能依赖于其他非主键字段,避免传递依赖关系。
32.数据库表的关联关系有几种
数据库表的关联关系有如下三种:
1.一对一关系
在现实生活中,丈夫与妻子之间的关系就是一对一的关系
2.多对多关系
学生与老师之间的关系就是多对多的关系
3.一对多
-
汽车制造商生产许多不同的车型,但特定的汽车型号仅由一家汽车制造商制造。
-
一个客户可以进行多次购买,但每次购买都是由单个客户进行的。
-
一家公司可以有多个电话号码,但一个电话号码属于一家公司。
33.MySql中怎么拼接字符串?
在MySQL中,可以使用 CONCAT() 、 CONCAT_WS() 、 GROUP_CONCAT()
CONCAT() 函数可以将两个或多个字符串连接在一起,返回一个新的字符串;
CONCAT_WS() 函数可以将多个字符串 用指定的分隔符 进行拼接;
GROUP_CONCAT() 函数返回一个字符串结果,该结果由分组中的值连接组合而成;如下代码返回用户的所有角色,以逗号隔开。
select a.*, GROUP_CONCAT(c.RName) 所属角色 from users a
join userroles b on a.UId=b.UserId
join roles c on c.RId=b.RoleId
group by a.Uid
以上示例代码,运行结果如下:
34.MySQL占用CPU特别高或者100%占用 的解决方案?
MySQL占用CPU特别高或100%占用的原因主要有查询语句不优化、硬件配置不足、MySQL配置不合理以及MySQL锁等待等。为了解决这些问题,可以采取以下措施:
-
对查询语句进行优化,使用索引、减少JOIN操作、避免使用子查询等。
-
升级硬件或者优化MySQL的配置参数,如增加CPU、内存、调整磁盘IO等,以提高MySQL的性能。
-
调整MySQL的配置参数,如缓存设置、连接数设置等,以提高MySQL的性能。
-
通过查看MySQL的日志信息,找到锁等待(死锁)的原因,并进行相应的调整,如增加并发性能、减少锁等待时间等。
35. 为什么要进行分库分表?
是什么?
分库、分表就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。
为什么?
数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式部署,而一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
36. 如何进行水平分表?
需要水平分表的原因:
- 随着数据量的增大,table行数巨大,查询的效率越来越低。表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度。
- 同样受限于操作系统中的文件大小限制,数据量不能无限增加,当到达一定容量时,需要水平切分以降低单表(文件)的大小。
切分原则:增量区间或散列或其他业务逻辑。
例子如下:按考生号区间进行水平分表
37. 如何进行垂直分表?
需要垂直分表的原因:
- 根据MySQL索引实现原理及相关优化策略的内容,我们知道Innodb主索引叶子节点存储着当前行的所有信息,所以减少字段可使内存加载更多行数据,有利于查询。
- 受限于操作系统中的文件大小限制。
切分原则:把不常用或业务逻辑不紧密或存储内容比较多的字段分到新的表中可使表存储更多数据。
优点:垂直分割可以使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少I/O次数。
缺点:需要管理冗余列,查询所有数据需要join操作。
例子:将商品信息表 垂直拆分成 商品信息表和商品描述表
本次分享就到这里。在面试中百分之六七十的问题都是数据库方面的,在熟悉以上问题的答案基础上,如果能够对一些原理有深刻的认知,比如索引的底层算法原理、数据库锁、百万级数据SQL查询优化等,那么面试肯定轻松拿捏了。