回答重点速度差很多,limit 10 快很多!
原因如下:
1)LIMIT 100000000, 10 需要先处理(通常是读取并跳过)前 100000000 条记录,然后再获取到需要的 10 条记录,开销成本很大,因为需要扫描 100000000 数据才能得到后面的 10 条数据,会导致大量的磁盘 I/O。
2)LIMIT 10 从结果集第一个记录开始扫描直接返回前 10 条记录。...
回答重点1)可移植性差
数据库依赖性:存储过程是在数据库服务器上执行的,通常使用数据库特定的 SQL 方言和功能,这会导致应用程序的数据库依赖性增加,迁移到其他数据库系统时有成本。
跨平台问题:不同的数据库系统实现存储过程的方式和支持的功能不完全相同,维护比较复杂。
2)调试困难
调试工具有限:相比应用层代码,数据库层的存储过程缺乏良好的调试工具和环境。常规的代码调试方法(如设置断点、...
回答重点第一范式(1NF):
确保每个列的值都是原子值,表中的每个字段只能包含单一的数据项,不允许重复的列和多值字段。
第二范式(2NF):
在满足第一范式的基础上,确保表中的每个非主键字段完全依赖于主键,而不是部分依赖。即,非主键字段必须依赖于整个主键。
第三范式(3NF):
在满足第二范式的基础上,确保非主键字段之间不依赖,即消除传递依赖。所有非主键字段只能依赖于主键,不应相互...
回答重点这道题目被问的几率不是很大,大家可以熟悉下,可以在实际开发中使用。
以下列举一些常用的函数类别:
1)字符串函数,用于处理文本数据:
CONCAT:连接字符串。
SUBSTRING:提取子字符串。
LENGTH:返回字符串的长度。
REPLACE:替换字符串中的子字符串。
UPPER 和 LOWER:将字符串转换为大写或小写。
TRIM:去除字符串两端的空格。
LEFT 和 RIG...
回答重点TEXT 是非标准字符串类型,除了它还有 TINYTEXT、MEDIUMTEXT 和 LONGTEXT,一般我们存储一些不确定的较长文本才会使用到它们,例如文章之类的。
它们的存储的文本长度汇总如下:
1)TINYTEXT:最大长度为 255 字节。
2)TEXT:最大长度为 65,535 字节(约 64 KB)。
3)MEDIUMTEXT:最大长度为 16,777,215 字节(约...
回答重点在 MySQL 中,如果表定义的自增 ID 到达上限后,再申请下一个 ID,得到的值不变! 因此会导致报重复值的错误。
扩展知识自增 ID 上限实验例如 int 是 4 个字节,上限是 2 的 32 次方 -1,即 2147483647,当到达这个值的之后,下次插入得到的还是这个值,来看一下实验:
123456create table mianshiya( id int aut...
回答重点在数据库中业界常用两种类型来存储金额:bigint 和 decimal。
1)bigint 代码中用 long。
范围:可以存储的整数范围为 -2^63 到 2^63 - 1(在 MySQL 中为 64 位有符号整数)
存储空间:占用 8 字节(64 位)
精度:精确存储整数,但不支持小数部分,存储的金额单位是分
2)decimal 代码中使用 BigDecimal。
范围:可...
回答重点数据库的视图是一个虚拟表,它并不存储实际的数据,而是通过查询其他表的数据来生成的。视图可以简化复杂的查询、增强数据安全性(限制访问某些数据)以及提供数据的不同表示方式。
它可以包含一个或多个表的数据,并且可以对这些数据进行筛选、计算、排序等操作。
扩展知识视图的作用
简化复杂查询:视图可以将复杂的查询封装成一个简单的视图,使得用户在查询数据时更加方便。
安全性:通过视图可以限制用户访...
回答重点
这道题面试遇到的几率比较低,但是游标这个概念还是需要了解。
数据库游标是一个数据库对象,使得应用程序可以逐行访问查询结果集,而不仅仅是一次性处理所有结果。它允许开发者在结果集中的行之间移动,方便进行复杂的数据操作,比如更新或删除特定的行。
扩展知识游标的作用和性能问题
逐行处理:游标允许逐行处理查询结果集,在需要对结果集中的每一行进行复杂操作时,非常有用。
灵活性:游标提供了对结...
回答重点MySQL 是关系型数据库,它设计的初衷是高效处理结构化和关系型数据,所以存储大容量的内容本身就不是它的职责所在,因此这方面的能力也不够。
应该将大容量文件存储在文件系统或云服务提供的对象存储服务中,仅在数据库中存储文件的路径或 URL 即可。
扩展知识数据库本身性能问题
数据库性能:存储和检索大容量的二进制数据(如图片、音频、视频)会显著增加数据库的 I/O 操作和处理时...
回答重点与 Oracle 相比,MySQL 有以下优势:
1)MySQL 有免费版本,成本低,Oracle 数据库的许可费用和维护成本较高。
2)MySQL 是开源的,有广泛的社区支持和丰富的文档资源,能快速上手和解决问题。
3)MySQL 适合小型和中型应用,相比 Oracle 资源占用较少,更加轻量。
而 Oracle 在处理大型企业级应用、复杂事务、并发控制和高级功能(如高...
回答重点两者的区别就是能存储的字符串长度上限不同,字符数上限是由定义中的括号内的数字决定的。
VARCHAR(100) 最多可以存储 100 个字符。
VARCHAR(10) 最多可以存储 10 个字符。
两者存储相同字符串时占用的空间是一样的。除了存储字符本身外,还需要额外的 1 或 2 个字节来记录字符串的长度。对于长度小于 255 的字符串,使用 1 个字节;对于长度 255 及以...
回答重点一般有以下几种情况不推荐建立索引:
1)对于数据量很小的表
当表的数据量很小(如几百条记录)时,建立索引并不会显著提高查询性能,反而可能增加管理的复杂性。
2)频繁更新的表
对于频繁进行插入、更新和删除操作的表,索引会导致额外的维护开销,因为每次数据变更时都需要更新索引,这会影响性能。
3)执行大量的 SELECT *
此时二级索引可能不会显著提升性能,因为需要大量的回表...
回答重点基本功能:
EXISTS 用于判断子查询是否返回任何行,通常用于检查某个条件是否满足。
IN 用于检查某个值是否在指定的集合中,可以是一个子查询或静态值列表。
性能差异:
EXISTS 一旦找到匹配行就会立即返回,通常在子查询返回较大数据集时性能更好。
IN 通常会评估整个子查询并构建一个值列表,然后再进行匹配,在处理较大数据集时可能性能较差。
使用场景:
EXISTS 更...
回答重点WAL(Write-Ahead Logging)技术是一种数据库事务日志管理技术,它确保在修改真正的数据之前,先将修改记录写入日志。这使得即使系统崩溃,通过日志也能恢复数据。保证了数据的持久性和一致性。
WAL 它的核心思想就是先写日志,再写数据,大致执行流程如下:
1)当一个事务开始时,所有对数据库的修改都会先记录到一个日志文件中,而不是直接应用到数据库文件,这些日志记录了数据的变...
回答重点MySQL 数据库的默认隔离级别是 RR(可重复读),但是很多大公司把隔离级别改成了 RC(读已提交),主要原因是为了提高并发和降低死锁概率。
为了解决幻读的问题 RR 相比 RC 多了间隙锁(gap lock)和临键锁(next-key lock)。而 RC 中修改数据仅用行锁,锁定的范围更小,因此相比而言 RC 的并发更高。
扩展知识RC 和 RR 区别实际例子来看下例子,感受更...
回答重点迁移想着很简单,不就是把一个库的数据迁移到另一个库吗?
但是实际上有很多细节,在面试中我们可以假装思考下,然后向面试官复述以下几点:
首先关注量级,如果是几十万的数据其实直接用代码迁移,简单核对下就结束了。如果数据量大那么才需要好好设计方案。
不停服数据迁移需要考虑在线数据的插入和修改,保证数据的一致性。
迁移还需要注意回滚,因为一旦发生问题需要及时切换回老库,防止对业务产生影响。...
回答重点对开发而言,一般可以从 SQL 和库表设计两部分优化 MySQL 性能问题。
SQL 优化根据慢 SQL 日志,找出需要优化的一些语句。
常见优化方向:
1)避免 SELECT *,只查询必要的字段
2)避免在 SQL 中进行函数计算等操作,使得无法命中索引
3)避免使用 %LIKE,导致全表扫描
4)注意联合索引需满足最左匹配原则
5)不要对无索引字段进行排序操作
6)连表查询需要...
回答重点逻辑删除是一种将数据标记为已删除但实际不会从数据库中移除的删除方式。一般是在表中添加一个表示删除状态的字段,如 is_deleted ,默认是 0 表示未删除,1 表示已删除。
物理删除则是直接从数据库中删除记录。
一般业务上都是使用逻辑删除,便于后续的数据分析、追溯等。
扩展知识物理删除的优缺点优点:
节省存储空间:物理删除释放了数据占用的存储空间。
查询性能提高:由于数据被彻底...
回答重点逻辑外键是一种在应用程序层面上管理和维护数据完整性的方法,而不是通过数据库本身的外键约束。主要是利用应用程序代码来保证引用的完整性。
逻辑外键的优缺点优点:
灵活性高:应用程序层面控制,可以更灵活地实现复杂的业务逻辑。
性能优化:避免了数据库层面的约束检查,可以在某些情况下提高性能(详细看扩展知识)。
跨数据库兼容性:逻辑外键在不同类型的数据库之间更容易迁移。
缺点:
代码复杂...
回答重点如果没有 MVCC,系统必须频繁地对读写操作进行加锁来保证数据的正确性,因为增加了锁的获取和释放的开销,会导致整体系统响应速度变慢,这种实现叫 LBCC (Lock-Based Concurrent Control)。
扩展知识LBCC (Lock-Based Concurrent Control)想象一下有一个事务 1 正在执行,此时一个事务 2 修改了记录 A,还未提交事务。
此...
回答重点1)脏读(Dirty Read):
一个事务读取到另一个事务未提交的数据。如果该未提交事务最终被回滚,那么第一个事务读取的数据就是不一致的(脏的)。
2)不可重复读(Non-repeatable Read):
在同一事务中,读取同一数据两次,但由于其他事务的提交,读取的结果不同。例如,事务 A 读取了一行数据,事务 B 修改并提交了这行数据,导致事务 A 再次读取时得到不同的值...
回答重点自动检测与回滚:
MySQL 自带死锁检测机制(innodb_deadlock_detect),当检测到死锁时,数据库会自动回滚其中一个事务,以解除死锁。通常会回滚事务中持有最少资源的那个。
也有锁等待超时的参数(innodb_lock_wait_timeout),当获取锁的等待时间超过阈值时,就释放锁进行回滚。
手动 kill 发生死锁的语句:
可以通过命令,手动快速地找出被...
回答重点MySQL 默认的隔离级别是可重复读( Repeatable Read ),即 RR。
原因是为了兼容早期 binlog 的 statement 格式问题,如果是使用读已提交、读未提交等隔离级别,使用了 statement 格式的 binlog 会导致主从(备)数据库数据不一致问题。
扩展知识进一步分析 binlog statement 格式和可重复级别的影响接下来我们来展开讲解下,...
回答重点在 MySQL 中,int(11) 中的 11 表示显示宽度,并不影响存储的大小或数值范围。具体来说:
显示宽度:当使用 ZEROFILL 属性时,int(11) 表示如果数值的位数少于 11 位,则会在前面填充零。例如,数值 42 将显示为 00000000042。不使用 ZEROFILL 时,显示结果是 42(前面有九个空格)
存储大小:int 类型始终占用 4 字节(32 位...
回答重点一般会使用主从架构来避免单点故障,主数据库处理写操作,从数据库处理读操作,主数据库故障时可以切换到从数据库。
同时会对数据进行定期备份并存储在不同的物理位置,以便在发生故障时能够快速恢复数据。
并且需要建立监控系统,实时监控数据库的健康状态,并在发生故障时及时告警。
扩展知识MySQL 主从,主备或者主主架构介绍
主备架构主备架构就是主机和备机。备机是不干活的,也就是不对外提供服务,...
回答重点CHAR 和 VARCHAR 是两种用于存储字符串的列类型,它俩最大的不同就是一个是固定长度,一个是可变长度。
CHAR(n):固定长度的字符串。CHAR 列的长度是固定的,即使存储的字符串长度小于定义的长度,MySQL 也会在字符串的末尾填充空格以达到指定长度(如果 char 类型的字符串后面有空格的话,innodb 会忽略)。
VARCHAR(n):可变长度的字符串。VARCH...
回答重点做法一:代码封装讲白了就是代码层面抽出一个中间层,由中间层来实现读写分离和数据库连接。
利用个代理类,对外暴露正常的读写接口,里面封装了逻辑,将读操作指向从库的数据源,写操作指向主库的数据源。
优点:简单,并且可以根据业务定制化变化,随心所欲。
缺点:如果数据库宕机了,发生主从切换了之后,就得修改配置重启。如果系统是多语言的话,需要为每个语言都实现一个中间层代码,重复开发。
做法...
回答重点
首先需要明确一个点延迟是必然存在的,无论怎么优化都无法避免延迟的存在,只能减少延迟的时间。
常见解决方式有以下几种:
二次查询。如果从库查不到数据,则再去主库查一遍,由 API 封装这个逻辑即可,算是一个兜底策略,比较简单。不过等于读的压力又转移到主库身上了,如果有不法分子故意查询必定查不到的查询,这就对主库产生冲击了。
强制将写之后立马读的操作转移到主库上。这种属于代码写死了...
回答重点分库分表是数据库性能优化的一种方法,通过将数据分散存储在多个数据库或表中,来提高系统的可扩展性、性能和可用性。
分库分表的类型(或策略) 包括:
1)水平分表:
将同一张表的数据按行划分,分散到多个表中。例如,可以按用户 ID 的范围将数据分为多个表(如 user_1、user_2)。
2)垂直分表:
将一张表的不同列拆分到多个表中,以减少每张表的字段数量和提高查询效率。例如,...