ITPub博客

首页 > 数据库 > 数据库开发技术 > Mysql的哪些知识点不能错过?

Mysql的哪些知识点不能错过?

原创 数据库开发技术 作者:IT枫斗者 时间:2024-01-09 11:39:08 0 删除 编辑

一、Mysql中有哪几种锁?

1. 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

2. 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

3. 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

二、Mysql中InnoDB支持的四种事务隔离级别?

1. read uncommited :读到未提交数据

2. read committed:脏读,不可重复读

3. repeatable read:可重读

4. serializable :串行事物

三、什么是脏写、脏读、不可重复读、幻读

脏写 :A和B两个事务都更新同一条数据, 数据原始值为1,A将数据改为2,B将数据改为3,这时候A回滚了,把B写的3也给抹掉了。这就是脏写。就是两个事务都更新一个数据,结果其中一个事务回滚了,这波操作把另一个事务刚写入的值也给抹掉了。

脏读 :一个事务中访问到了另外一个事务未提交的数据,读未提交隔离级别会造成脏读。

不可重复读:同一个事务里,读取同一条记录多次可能读到不一致的结果。比如A和B两个事务,A负责读取两次,B负责修改数据,A第一次读取到1,B给修改成2且提交了。A在读取的时候发现变成了2,同一个事物里读到的结果不一致了。可重复读策略可以避免此类情况。

幻读 :比如范围查询,同一个事物里执行两次 where id > 10; 第一次结果是100条记录,但是其他事务在执行第二遍的时候insert了一条,那么回到原事务里再次执行的时候出现了101条记录。

四、CHAR和VARCHAR的区别?

1. CHAR和VARCHAR在存储和检索方面有所不同。

2. CHAR列长度固定为创建表时声明的长度,长度值范围是1到255,当CHAR值被存储时,它们被用空格填充到特定长度,检索CHAR值时需删除尾随空格。

五、BLOB和TEXT有什么区别?

1. BLOB是一个二进制对象,可以容纳可变数量的数据。TEXT是一个不区分大小写的BLOB。

2. BLOB和TEXT类型之间的唯一区别在于对BLOB值进行排序和比较时区分大小写,对TEXT值不区分大小写。

六、mysql_fetch_array和mysql_fetch_object的区别是什么?

mysql_fetch_array – 将结果行作为关联数组或来自数据库的常规数组返回。

mysql_fetch_object – 从数据库返回结果行作为对象。

七、Mysql如何优化DISTINCT?

DISTINCT在所有列上转换为GROUP BY,并与ORDER BY子句结合使用。

八、mysql查询ID正序排列的第十条,到第二十条数据

select * from table order by id limit 10, 10; -- limit 10, 10 表示从第11条数据开始(起始位置是 10),返回 10 条数据

还有一种写法就是:

select * from table order by id limit 10 offset 10;-- OFFSET是要跳过的条数,这里跳过前10,然后(LIMIT 10)取接下来的10条数据

九、可以使用多少列创建索引?

任何标准表最多可以创建16个索引列。

十、如果一个表有一列定义为TIMESTAMP,当行数据被修改时会怎样?

时间戳字段将获取当前时间戳。

十一、列设置为AUTO INCREMENT时,如果在表中达到最大值,会发生什么情况?

它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。

十二、NOW()和CURRENT_DATE()有什么区别?

NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。

CURRENT_DATE()仅显示当前年份,月份和日期。

十三:通用的SQL函数

1. CONCAT(A, B) :连接两个字符串值以创建单个字符串输出。通常用于将两个或多个字段合并为一个字段。

2. FORMAT(X, D):格式化数字X到D有效数字。

3. CURRDATE(), CURRTIME():返回当前日期或时间。

4. NOW():将当前日期和时间作为一个值返回。

5. MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() :从日期值中提取给定数据。

6. HOUR(),MINUTE(),SECOND():从时间值中提取给定数据。

7. DATEDIFF(A,B):确定两个日期之间的差异,通常用于计算年龄

8. SUBTIMES(A,B) :确定两次之间的差异。

9. FROMDAYS(INT) :将整数天数转换为日期值。

十四、MySQL表的数据量逐渐增大的情况,怎么优化?

1. 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。

2. 书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE。

3. 选择合适的表字段数据类型和存储引擎,适当的添加索引。

4.添加缓存机制,比如memcached等。

5. 不经常改动的页面,生成静态页面。

6. mysql库主从读写分离。

7. 找规律分表,减少单表中的数据量提高查询速度。

十五、数据库中的事务

事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。

十六、事务特性

1. 原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。

2. 一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态。

3. 隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务。

4. 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

十七、选择合适的表字段的数据类型

字段类型优先级: 整形>date,time>enum,char>varchar>blob,text

优先考虑数字类型,其次是日期或者二进制类型,最后是字符串类型,同级别得数据类型,应该优先选择占用空间小的数据类型。

如果是字符串类型,数据长度是固定的,使用CHAR效率会高点,如果数据长度可变,使用VARCHAR不会浪费多余的空间;

整数类型,如果整数值不需要太大范围就用int,整数值大的话就用bigint

浮点数类型用double,decimal用于存储非常精确的小数,比如货币等需要精确计算的场景

DATE:用于存储日期,TIME:用于存储时间,DATETIME 或 TIMESTAMP:用于存储日期和时间

BOOLEAN 或 TINYINT(1):用于存储布尔值,表示真或假

text类型存储文本类型非常大的

对于字段类型的设计也要同时考虑当前的业务需求和后期的业务扩展

十八、索引的优缺点

相当于一本书的目录,可以快速访问数据表中的信息,提高检索速度。

创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。

十九、如何通俗地理解三个范式?

第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;

第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;

第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。。

范式化设计优缺点:

可以尽量的减少数据冗余,使得更新快,体积小;对于查询需要多个表进行关联,减少写得效率增加读得效率,更难进行索引优化

反范式化:

可以减少表的关联,可以更好的进行索引优化;数据冗余以及数据异常,数据修改需要更多的成本

举报/反馈


原文作者:IT枫斗者;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
大家好,我是枫哥,🌟阿里云技术专家、📝资深面试官、🌹Java跳蚤网课堂创始人。技术交流vx:itfdz666,拥有多年一线研发经验,曾就职过科大讯飞、美团网、平安等公司。看面试实战视频可以关注b站号:IT枫斗者–Java面试。需要看技术文章,可以关注CSDN:IT枫斗者。

注册时间:2020-05-13

  • 博文量
    183
  • 访问量
    81334