MySQL基础随堂笔记4

1、数据库三范式

1、数据列不可在分割

2、在第一范式上,所有非主键列完全依赖主键,而不是只依赖主键的一部分

2、在第二范式上,所有非主键列之间不存在传递依赖

2、内连接、左连接、右链接有什么区别

1、内连接是等值比较,查询两个表相交的数据

2、左连接左边是主表,查询出左边表所有的数据,右边表未查询出的数据用NULL代替

3、右连接右边是主表,查询出右边表所有的数据,左边表未查询出的数据用NULL代替

3、inner join 、left join、right join,优先使用inner join,为什么?

inner join是等值比较,保留两张表中完全匹配的结果集

使用left join 左边尽量小,条件查询放到左边上

使用right join 右边尽量小,条件查询放到右表上

mysql 连表查询原则:小表驱动大表,从而让性能最优

4、表关联不宜太多,最多3个足以

表关联越多,编译的时间和开销就越大

5、union 和 union all有什么区别

union会去掉重复行

6、count(*),count(1),count(字段)的区别

count(*) 会统计表中所有记录,包括字段为null的。也就是说,无论字段是都为空,只要存在该列,都会被统计

count(1) 会统计表中所有的记录。括字段为null的

count(字段) 会统计该字段的记录。忽略该字段中的null值。

7、Mysql中主要的数据类型

1、整型类型 TINYINT、SMALLINT,MEDIUMINT,INT,BIGINT

2、浮点类型 FLOAT、DOUBLE,DECIMAL

3、日期时间类型 DATE、TIME、DATETIME、TIMESTAMP(时间戳)

4、字符串类型 CHAR、VARCHAR、TEXT、BLOB(二进制对象)

5、二进制类型 BINARY、VARBINARY

9、float和double的区别

FLOAT和DOUBLE都是存储近似值的浮点数类型,它们在精度,存储空间和计算速度方面存在差异

精度:DOUBLE的精度高于FLOAT。DOUBLE是双精度,而FLOAT是单精度

存储空间:由于精度不同,DOUBLE占用的存储空间是FLOAT的两倍。FLOAT的存储空间是4个字节,DOUBLE的存储空间是8个字节

计算速度:由于DOUBLE的精度高,计算过程相对复杂。所以计算速度没有FLOAT快。

11、CHAR和VARCHAR的区别

CHAR是定长字符串,VARCHAR是边长字符串。比如同样存储'101'。

CHAR(10)会存储3个字节和7个空字符(用空格隔开)

VARCHAR(10)会存储3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度存储。

CHAR的效率比VARCHAR的效率高

VARCHAR比CHAR节省空间,效率上比CHAR差一点。即想要效率,就得牺牲一点空间。这就是在数据库设计中常说的"以空间换效率"

12、MySQL中用什么数据类型存储硬币

DECIMAL:可以指定总共的位数和小数点后的位数,这使得它非常适合用于存储货币金额,因为货币金额通常需要精确到小数点后几位。

13、为什么银行,财务要用DECIMAL类型

FLOAT,DOUBLE属于非精度浮点

DECIMAL属于精度浮点

1、DECIMAL为精度浮点,在计算中不会丢失精度

2、占用的空间又定义的宽度决定。每4个字节可以存储9位数字,并且小数点要占用一个字节

3、可用于存储比BIGINT更大的整数

14、为什么说尽量用数字代替字符串类型。

引擎在处理查询中的字符串会逐个比较每一个字符,对于数字类型只需要比较一次就够了

字符串会降低查询和连接性能,增大存储开销

15、为什么建议把TEXT、BLOB类型分离到单独的扩展中

MySQL内存临时表不支持TEXT、BLOB这样的大数据类型。如果查询中包含这样的数据,在排序等操作中,就无法使用内存临时表,必须使用磁盘临时表

进行。而且对于这种数据,MySQl还是要进行二次查询,会使sql性能变得很差

16、如何选择高效的数据类型。口诀:更小的更好

1、更小的。一般情况下,应该选择更小的数据类型。更小的数据类型通常更快。因为占用更少的磁盘空间,内存和CPU缓存。处理时CPU的周期更短

2、更简单的。比如:整型比字符串的代价更低

3、尽量避免NULL

18、为什么建议MySQL在WHERE查询中避免使用NULL

1、首先,并不是说使用的is null或is not null就不会走索引。这和MySQL的版本和查询优化成本有关

2、MySQL优化器发现走索引比不走索引的成本的还要高,那就会放弃索引。!=、<>、is null、is not null经常会被认为让索引失效

3、其实是优化器认为查询成本高,自动放弃的走索引

4、如果把null值换成了默认值,很多时候让走索引变成可能

19、为什么避免在WHERE字句中使用!=或<>操作

1、使用!=或<>操作有可能让索引失效

2、MySQL优化器会根据查询的成本计算,使用!=或<>操作成本高,引擎将放弃使用索引而进行全表扫描

3、实现业务优先,不是说不能用😄

20、MySQL中的字符集

字符集:show charset;

校对集:show collation;

常见的MySQl字符集主要有以下四种:

GBK: 长度2 支持中文,但不是国际通用字符集

UTF-8: 长度3 支持中英文混合场景,是国际通用字符集

latin1: 长度1 MySQL默认字符集

utf8mb4: 长度4 完全兼容UTF-8,用四个字节存储更多的字符

21、MySQL中有哪些基础函数

LEFT(s,n) 返回字符串 s 的前 n 个字符

LOWER(s) 将字符串 s 的所有字母变成小写字母

LPAD(s1,len,s2) 在字符串s1的左边开始填充字符串s2。使整个字符串长度达到len

LTRIM(s1) 去掉字符串s1左边的空格

REPEAT(s,n) 将字符串 s 重复 n 次

REVERSE(s) 将字符串s的顺序反过来

SUBSTR(s, start, length) 从字符串 s 的 start 位置截取长度为 length 的子字符串

TRIM(s) 去掉字符串 s 开始和结尾处的空格

LOWER(s) 将字符串转换为小写

UPPER(s) 将字符串转换为大写

CONCAT(a,b,...,n) 合并字符串

CONCAT_WS(x, a,b...n) 合并字符串,每个字符串中间添加分隔符x

ASCII(s) 返回字符串 s 的第一个字符的 ASCII 码

CHAR_LENGTH(s)、CHARACTER_LENGTH(s) 返回字符s的字符数

日期格式化函数 DATE_FORMAT()

日期加减函数 DATE_ADD()、DATE_SUB()

时间函数 NOW()、SYSDATE()

日期和时间函数 CURDATE()、CURTIME()、CURRENT_TIMESTAMP()

22、MySQL有哪些常见的运算符

算数运算符:加减乘除取模

比较运算符 >,<,=,!=,>=,<=

逻辑运算符 AND,OR,NOT

位运算符

23、MySQL的执行过程

1、客户端发送一条sql查询指令到服务器

2、MySQL服务器会检查当前查询是否有缓存,有缓存就从缓存中获取数据并返回。

3、没有缓存,MySQL会通过关键字进行解析,并生成一颗解析树。解析器会根据MySQL语法进行解析验证,主要检测是否存在关键字或关键字有没有使用错误

4、预处理会根据MySQL规则检查解析树是否合理,主要检查表和字段是否存在,还会检测别名。然后预处理器还会验证权限

5、执行计划查询执行引擎,通过API接口调用存储引擎里的数据

6、返回数据给客户端并缓存数据

24、数据库常见的规范有哪些

1、所有数据库对象名称,字段都用小写字母并用下划线分割

2、所有数据库对象名称禁止使用MySQL保留关键字

3、数据库对象的名称要见名识意,名称不能多长(不得超过32个字符)

4、临时库表必须以tmp为前缀并以日期为后缀,备份表必须以bak为前缀并以日期(时间戳)为后缀

5、所有存储相同数据的列名和数据类型要保持一致

25、说说MySQL的三层逻辑架构

第一层负责连接管理、授权认证,安全等

第二层负责解析查询

第三层是存储引擎

26、MyISAM和InnoDB的区别

MyISAM不支持事务、InnoDB支持事务

MyISAM是表级锁、InnoDB是行级锁

MyISAM不支持外键、InnoDB支持外键

MyISAM无缓冲合并,写操作时全表锁定、InnoDB无缓冲合并,写操作时全表锁定

MyISAM依赖MySQL的key buffer、InnoDB有自己的缓冲池

MyISAM适合读密集型应用,对事务要求不高的场景、InnoDB适合写密集型应用,特别是需要事务支持和数据完整性保证的场景

对于只涉及简单读取的应用,MyISAM可能是一个好选择;而对于需要事务处理和高并发写入的应用,InnoDB通常是更合适的选项。

27、InnoDB存储引擎有哪些特性

1、事务支持。InnoDB支持ACID(原子性,一致性,隔离性,持久性)事务,保证数据的完整性和一致性

2、外键约束 InnoDB支持外键约束,可以在数据库层面保证数据的完整性,防止出现无效或不一致的数据。

3、行级锁定 InnoDB使用行级锁定机制,只锁定需要修改的行,而不是整个表,从而提高了并发性能

4、多版本并发控制(MVCC) InnoDB通过多版本控制实现高并发读写操作,允许多个读者和写者同时访问数据,而不会相互干扰

5、缓冲池 InnoDB使用缓冲池来缓存数据和索引,减少了磁盘I/O操作,从而提高了查询性能

6、热备份 InnoDB支持在线热备份,可以在不停止数据库服务的情况下进行备份操作,这对于需要持续运行的应用来说是非常有用的。

28、一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?

如果是InnoDB引擎,在不重启的情况下,自增ID是8.当重启后是6. 因为InnoDB表只把自增主键的最大ID记录在内存中,如果重启,已删除的最大ID会丢失

如果是MyISAM引擎, 不管重启不重启,自增ID是8

29、说一下MVCC中文ACID代表什么

1、原子性(Atomicity)整个事务中的所有操作,要么全部完成,要么全部不完成

2、一致性(Consistency)事务在开始之前和结束之后,数据库的完整性约束没有被破坏

3、隔离性(Isolation) 事务执行期间看到的数据不应受其他并发事务的影响

4、持久性(Durability) 一旦提交事务,结果直接卸载磁盘中,永久保存

30、MVCC是什么,有什么作用

MVCC,即多版本并发控制,是数据库管理系统中用于提高数据读取效率和并发性的一种技术。

MVCC的主要作用是在数据库系统中,特别是在高并发场景下,提供一种机制来避免读写操作之间的冲突。具体来说,它允许多个事务同时对同一数据进行读操作,不会相互干扰。

这是因为每个事务都会看到一个数据的"快照",这个快照是事务开始时的数据状态,而不是实时的数据状态。这样,即使在事务执行期间其他事务对数据进行了修改,当前事务也能保持对数据的一致性视图。

MVCC通过维护数据的不同版本,实现了在不牺牲数据一致性的前提下,提高了数据库的并发性能和读取效率。这在现代数据库管理系统中,尤其是在处理大量并发读操作的场景下,是非常重要的一个特性。

31、清空表优先使用TRUNCATE

TRUNCATE TABLE在功能上与不带 WHERE子句的 DELETE语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE比 DELETE速度快,且使用的系统和事务日志资源少。

truncate table删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE

32、操作DELETE或UPDATE语句时,为什么要加个LIMIT限制或者循环分批删除

减低写错SQL的代价 添加LIMIT删除错误也只是部分,可以通过binlog日志快速回复

SQL效率有可能更高

避免长事务 例如:delete执行时,如果age加了索引,MySQL会将所有相关的行加写锁和间隙锁,所有执行相关行会被锁住,如果删除数量大,会直接影响相关业务无法使用。

数据量大的话,容易把CPU打满 如果删除量很大,不加LIMIT限制的话,容易把CPU打满,会导致越删越慢

锁表 一次性删除太多,可能造成锁表,会有会有lock wait timeout exceed的错误,所以建议分批操作。

33、MySQL中IN和EXIST的区别

主表大,子表小用IN

主表小,子表大用EXIST

34、分页查询的优缺点是什么

优点:

减少数据传输的数据量,提高数据检索效率,减少网络流量

提升用户体验,通过分页可以使得页面加载更快

节省内存,提升查询性能

缺点:

如果数据量比较大,频繁的分页可能使数据库查询性能降低

35、如何提高数据库的查询性能

使用索引

避免全表扫描

优化SQL语句

使用缓存

使用数据库分区

应用层面的优化

使用分页

36、MySQL优缓存吗

1、查询缓存。MySQL中用来缓存查询结果的一种机制,它能够存储SELECT查询的结果集,当同样的查询再次执行时,可以直接从缓存中获取结果

2、表缓存。用来缓存表的元数据,如表的结构定义,索引信息等

3、Key Buffer缓存 Key Buffer 缓存主要用于 MyISAM 存储引擎,用于缓存索引数据。它可以加快索引的访问速度,提高查询性能。

4、InnoDB缓存池 InnoDB 缓存池主要用于存储 InnoDB 存储引擎的数据和索引。通过将热数据存储在内存中,减少了磁盘 IO 的次数,提高了数据的访问速度和查询性能。

具体应用场景包括:

当系统中有一些查询需求是重复性的,且数据不经常变动时,可以开启查询缓存来提高查询性能。

当需要大量使用 MyISAM 存储引擎的表时,可以通过调整 Key Buffer 缓存来提高索引的访问速度。

当需要使用 InnoDB 存储引擎时,通过调整 InnoDB 缓存池的大小,可以提高数据的访问速度和查询性能。

37、MySQL如何判断命中缓存

判断是否命中时,MySQL不会解析,而是直接使用SQL语句和客户端发送过来的其它原始信息。任何字符上的不同,例如空格、注释,丢回导致缓存的不命中。

通常使用统一的编码规则是一个好的习惯,会让你的系统运行的更快。

当查询语句中有一些不确定的数据时,不会被缓存,比如函数now()。实际上,如果缓存中包含任何用户自定义函数、存储函数、用户变量、临时表、

MySQL系统表、或者任何包含列级别权限的表,都不会被缓存。

38、缓存表和汇总表有什么区别

有时提升性能最好的方法是在同一张表中保存衍生的冗余数据,有时候还需要创建一张完全独立的汇总表或缓存表。

缓存表用来存储那些获取很简单,但速度较慢的数据

汇总表用来保存使用group by语句聚合查询的数据

39、每个InnoDB表必须有主建吗

InnoDB是一种索引组织表,数据存储的逻辑顺序适合索引相同的。每个表都有可能有多个索引,但是表的存储顺序只有一种。

Innodb是按照主键索引的顺序来组织表的

1、不要使用更新频繁的列作为主键,不适用多列主键;

2、不要使用UUID、MD5、HASH、字符串列作为主键(无法保证数据的顺序增长);

3、主键建议使用自增ID值;

40、设计数据库时有哪些原则

1、数据库设计项目中的重中之重,所有项目的开发都是和数据打交道。好的数据可设计,能在性能上占大一部分

2、数据库设计字段不要只停留在页面表面

页面内容所需字段,在数据库设计中只是一部分,还有系统运转、模块交互、中转数据、表之间的联系等等所需要的字段,因此数据库设计绝对不是简单的基本数据存储,还有逻辑数据存储。

3、数据库设计完成,80%的设计开发都要呈现在你的脑海中

每个字段的设计都要有他存在的意义,要清楚的知道程序中如何去运用这些字段,多张表的联系在程序中是如何体现的。

4、数据库设计时要优先考虑效率和优化问题

5、添加必要的冗余字段

6、设计合理的表关联

若两张表之间的关系复杂,建议采用第三张映射表来关联维护两张表之间的关系,以降低表之间的直接耦合度。

7、设计表时要考虑表主外键等约束关联,系统编码

8、选择合适主键生成(自增ID)

41、数据库设计原理有哪些

1、业务逻辑和数据分离

2、安全设计

3、性能

4、数据增长和分布模式

5、备份和恢复策略

6、明确表依赖和主外键关系

42、视图是一种虚拟的表,是一个逻辑表,本身不包含数据。作为一个select语句保存在数据字典中的

43、存储过程和函数的区别

存储过程(Procedure)和函数(Function)是数据库中常用的两种可重复调用的程序单元,它们都包含了多条 SQL 语句来执行特定的任务。然而,存储过程和函数之间存在一些关键的区别:

存储过程:

1、返回值:存储过程可以包含输入参数、输出参数和返回参数,但一般情况下不返回结果集或值,而是通过输出参数或其他方式将结果传出。

2、事务管理:存储过程可以包含事务控制语句(如 COMMIT、ROLLBACK)来管理事务的范围,可以修改数据库的数据,保证数据的一致性。

3、可以包含 DML 语句:存储过程可以包含数据操纵语言(DML)语句(如 INSERT、UPDATE、DELETE),可以对数据库进行增删改操作。可独立执行:

4、存储过程可以单独执行,也可以被其他程序或代码调用执行,适用于处理业务逻辑和复杂查询等场景。

5、存储在数据库中:存储过程是存储在数据库中的,因此可以减少数据的传输量,提高性能。

函数:

1、返回值:函数通常返回一个值(标量值或表),可作为查询的一部分来使用,具有明确的返回结果。

2、只读操作:函数通常用于执行只读操作,不能包含数据操纵语言(DML)语句,不能修改数据库中的数据。

3、不能包含事务控制语句:函数不能包含 COMMIT、ROLLBACK 等事务控制语句,因为函数在调用时处于当前事务的上下文中。

4、适用于数据查询:函数适用于在查询中计算和处理数据,可以像内置函数一样被调用。

4、可以嵌套调用:函数支持嵌套调用,一个函数内可以调用另一个函数,形成层层调用的逻辑。

44、索引不易太多

1、索引并不是越多越好,虽然提高了查询效率,但却会降低插入和更新的效率

2、索引可以理解是一张表,其可以存储数据。有数据就会占用空间

3、索引表的数据是排好序的,排序就要花时间

4、INSERT或UPDATE可能会重建索引,如果数据量巨大,索引将重新进行排序。需要占用时间。所以建立索引要慎重考虑

5、一个表索引数量不要超过5个。若太多,则要考虑一些索引是否有存在的必要性

45、什么情况下不适合添加索引

1、频繁更新的字段

2、区分度抵的字段

3、数据量小的表

5、BLOB或TEXT数据类型的字段

46、避免索引失效的一些原则

1、复合索引,不要跨列或无序使用(最佳左前缀);

2、符合索引,尽量使用全索引匹配;

3、不要在索引上进行任何操作,例如对索引进行(计算、函数、类型转换),索引失效;

4、复合索引不能使用不等于(!=或<>)或 is null(is not null),否则索引失效;

5、尽量使用覆盖索引(using index);

6、like尽量以常量开头,不要以%开头,否则索引失效;如果必须使用%name%进行查询,可以使用覆盖索引挽救,不用回表查询时可以触发索引;

7、尽量不要使用类型转换,否则索引失效;

8、尽量不要使用or,否则索引失效;

47、为什么避免在where子句中使用or来连接条件

1、使用OR可能使索引失效,全表扫描

2、虽然mysql是有优化器的,处于效率与成本考虑,遇到or条件,索引还是可能失效的

48、索引怎么定义

1、普通索引:这是最基本的索引类型,没有任何限制,可以简单地通过CREATE INDEX语句创建。

2、唯一索引:这种类型的索引确保在列中的所有值都是唯一的,不允许出现重复的值。

3、主键索引:主键索引是唯一索引的一个特例,它确保每个表都有一个唯一的主键,通常在创建表时定义主键时自动创建。

4、全文索引:这种索引用于全文搜索,允许对文本字段进行复杂的搜索操作。

5、聚簇索引:在聚簇索引中,数据行存储在索引的叶级页上,这意味着整个表的行按照索引的顺序物理存储。

6、非聚簇索引:与聚簇索引相反,非聚簇索引的叶级页包含指向数据行的指针,而不是数据行本身。

49、什么是全文索引,怎么创建,有哪些应用场景

全文索引是一种能快速检索文本信息的数据结构它适用于需要对大量文本数据进行搜索的场景

可以在创建表的SQL语句中指定FULLTEXT KEY来创建全文索引列,也可以使用ALTER TABLE语句为表中的列添加全文索引。

全文索引的应用场景:

1、当使用LIKE操作符进行模糊查询时,普通索引可能会失效,而全文索引可以提供更快的查询速度。

2、全文索引支持MATCH...AGAINST语句,这允许用户在特定列中搜索包含关键词的记录

50、覆盖索引、回表的理解

覆盖索引避免了回表操作,提高了查询效率。

覆盖索引指的是一个查询只需要通过索引就能获取所有需要的数据,而无需访问数据行本身。这通常发生在查询中所需的列全部包含在索引中的情况。

回表指当索引不包含查询所需的所有列时,先通过索引找到对应的聚簇索引值(通常是主键),然后再通过这个聚簇索引值去查找完整的行记录。这个过程涉及到两次索引扫描,

第一次是查找二级索引,第二次是查找聚簇索引,因此性能会比覆盖索引低。

51、创建索引应该遵循哪些基本原则

1、最左前缀匹配原则

2、选择性原则

3、为搜索条件、排序和分组字段创建索引

数据库索引的意义和作用:

1、提高查询速度:通过创建唯一性索引,我们可以加快数据的检索速度。

2、唯一索引确保了数据库表中的每一行数据的唯一性,这对于保持数据的精确性和可靠性至关重要。

3、加速表连接:在进行多表连接查询时,如果关联字段上有索引,则可以显著减少连接操作的时间复杂度,进而提升整体的查询效率。

52、复合索引最左特性

复合索引也称为联合索引,当我们创建一个联合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则。

创建复合索引:ALTER TABLE employee ADD INDEX idx_name_salary (name,salary)

53、使用联合索引时,为什么需要注意索引中的顺序

联合索引是针对多个字段创建的索引,它包含了这些字段的所有组合,按照指定的顺序排列。例如,一个由字段A、B、C组成的联合索引实际上相当于同时拥有A、AB、ABC三个单独的索引。

54、MySQL中数据页和数据行的区别

数据页是数据库存储和管理数据的基本单元(一页占16kb),而数据行则是实际存储数据记录的单元。

数据页是MySQL在磁盘与内存交互的基本单元。这种设计可以减少内存与磁盘的交互次数,从而提升数据库的性能。数据页内部包含多个数据行,它们在物理上是连续存储的。每个数据页都有页头信息,包括页的元数据、控制信息等。此外,数据页之间通过指针相连,形成了一个双向链表的结构。

数据行是数据库中实际存储数据记录的单位。每条数据行包含了一行数据的所有列值。在InnoDB存储引擎中,数据行被组织成页的形式存储在磁盘上。当执行查询时,相关的数据行会被加载到内存中进行处理。

55、MySQL中数据页的作用是什么

1、减少磁盘的I/O操作

2、缓存设计思想

3、数据页链表结构

56、sql语句执行慢,如何优化

1、分析查询计划

2、添加或优化索引

3、选择合适的字段类型

4、优化子查询

5、限制查询结果集

6、避免在WHERE字句中使用函数表达式或函数

7、减少JOIN操作

8、避免使用LIKE操作符

9、批量操作

10、调整MySQL配置

11、分区表

12、定期维护表

相关推荐
牛马鸡niumasi1 小时前
Mysql:索引与B+树
mysql
Java成神之路-1 小时前
MySQL 函数索引与虚拟列深度解析
mysql
wx—chenyg52511 小时前
小红薯笔记种草科普引流
笔记
李白你好1 小时前
AI 辅助生成的红队对抗技术笔记
人工智能·笔记
ん贤1 小时前
Kubernetes(k8s) 详细笔记
笔记·容器·kubernetes
Languorous.1 小时前
Linux 系统安装 MySQL(CentOS8/Ubuntu),命令行实操完整版
linux·mysql·ubuntu
huaiixinsi1 小时前
Canal + Outbox、Kafka 选型与高可用、Caffeine 底层原理总结
java·数据库·分布式·mysql·spring·adb·kafka
江屿风1 小时前
【c++笔记】类和对象流食般投喂(中)
开发语言·c++·笔记
许长安1 小时前
Kafka 架构讲解:从提交日志到分区副本机制
c++·经验分享·笔记·分布式·架构·kafka