vlambda博客
学习文章列表

每日三道面试题(mysql)

每日上班的路上、上班前无聊看三道面试题,积少成多,话不多说,开刷mysql面试题:

1.数据库的三范式是什么?什么是反模式?

重点在于反模式的回答。实际开发中,不会严格遵守三范式

第一范式,强调属性的原子性约束,要求属性具有原子性,不可再分解。

第二范式,强调记录的唯一性约束,表必须有一个主键,并且没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。

第三范式,强调属性冗余性的约束,即非主键列必须直接依赖于主键。

范式可以避免数据冗余,减少数据库的空间,减轻维护数据完整性的麻烦。

 

然而,通过数据库范式化设计,将导致数据库业务涉及的表变多,并且可能需要将涉及的业务表进行多表连接查询,这样将导致性能变差,且不利于分库分表。因此,出于性能优先的考量,可能在数据库的结构中需要使用反模式的设计,即空间换取时间,采取数据冗余的方式避免表之间的关联查询。至于数据一致性问题,因为难以满足数据强一致性,一般情况下,使存储数据尽可能达到用户一致,保证系统经过一段较短的时间的自我恢复和修正,数据最终达到一致。

 

需要谨慎使用反模式设计数据库。一般情况下,尽可能使用范式化的数据库设计,因为范式化的数据库设计能让产品更加灵活,并且能在数据库层保持数据完整性。

 

有的时候,提升性能最好的方法是在同一表中保存冗余数据,如果能容许少量的脏数据,创建一张完全独立的汇总表或缓存表是非常好的方法。举个例子,设计一张“下载次数表”来缓存下载次数信息,可使在海量数据的情况下,提高查询总数信息的速度。


2. MySQL 中 varchar 与 char 的区别?varchar(50) 中的 50 代表的是什么意思? 

1varchar 与 char 的区别,char 是一种固定长度的类型,varchar 则是一种可变长度的类型。

2varchar(50) 中 50 的涵义最多存放 50 个字符。varchar(50) 和 (200) 存储 hello 所占空间一样,但后者在排序时会消耗更多内存,因为 ORDER BY col 采用 fixed_length 计算 col 长度(memory引擎也一样)。


3. int(11) 中的 11 代表的是什么?

MySQL支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。

也就是说,int的长度并不影响数据的存储精度,长度只和显示有关