MySQL常见面试题(一)

前言
在数据库管理系统中,存储引擎起着核心的角色,它决定了数据管理和存储的方式。MySQL作为一个领先的开源关系型数据库管理系统,提供了多种存储引擎来满足不同的需求和优化不同的应用。除了选择合适的存储引擎,数据库的设计还涉及到范式设计和表设计,这两者都对数据库的性能和数据一致性有深远的影响。在本文中,我们将探讨MySQL的各种存储引擎,比较MyISAM和InnoDB两种流行的存储引擎,深入数据库的范式设计,并探讨在数据库表设计时应如何选择合适的字段。此外,我们还将讨论在MySQL中记录货币时应选择哪种字段类型。

个人主页:尘觉主页

个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力

在csdn获奖荣誉: csdn城市之星2名
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ Java全栈群星计划top前5
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣  端午大礼包获得者
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 阿里云专家博主
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 亚马逊DyamoDB结营

欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦

文章目录

    • MySQL中有哪些存储引擎?
    • MyISAM和InnoDB的区别是什么?
    • 请概述下数据库的范式设计
    • 数据库表设计时,字段你会如何选择?
    • mysql里记录货币用什么字段类型好?
    • 总结

MySQL中有哪些存储引擎?

InnoDB存储引擎

InnoDB是MySQL的默认事务型引擎,也是最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期(short-lived)事务,应该优先考虑InnoDB引擎。

MylSAM存储引擎

在MySQL 5.1及之前的版本,MyISAM是默认的存储引擎。MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级锁,而且崩溃后无法安全恢复。MyISAM对整张表加锁,很容易因为表锁的问题导致典型的的性能问题。

Mrg_MylSAM

Merge存储引擎,是一组MyIsam的组合,也就是说,他将MyIsam引擎的多个表聚合起来,但是他的内部没有数据,真正的数据依然是MyIsam引擎的表中,但是可以直接进行查询、删除更新等操作。

Archive引擎

Archive存储引擎只支持INSERT和SELECT操作,会缓存所有的写并利用zlib对插入的行进行压缩,所以比MyISAM表的磁盘I/O更少。但是每次SELECT查询都需要执行全表扫描。所以Archive表适合日志和数据采集类应用,Archive引擎是一个针对高速插入和压缩做了优化的简单引擎。

Blackhole引擎

Blackhole引擎没有实现任何的存储机制,它会丢弃所有插入的数据,不做任何保存。可以在一些特殊的复制架构和日志审核时发挥作用。但这种引擎在应用方式上有很多问题,因此并不推荐。

CSV引擎

CSV引擎可以将普通的CSV文件(逗号分割值的文件)作为MySQL
的表来处理,但这种表不支持索引。因此CSV引擎可以作为一种数据交换的机制,非常有用。

Federated引擎

Federated引擎是访问其他MySQL服务器的一个代理,它会创建一个到远程MySQL服务器的客户端连接,并将查询传输到远程服务器执行,然后提取或者发送需要的数据。默认是禁用的。

Memory 引擎

Memory表至少比MyISAM 表要快一个数量级,数据文件是存储在内存中。Memory表的结构在重启以后还会保留,但数据会丢失。

Memroy表在很多场景可以发挥好的作用:

用于查找(lookup)或者映射(mapping)表,例如将邮编和州名映射的表。

用于缓存周期性聚合数据(periodically
aggregated data)的结果。

用于保存数据分析中产生的中间数据。

Memory表支持 Hash索引,因此查找操作非常快。Memroy表是表级锁,因此并发写入的性能较低,每行的长度是固定的,可能导致部分内存的浪费。

NDB集群引擎

使用MySQL服务器、NDB集群存储引擎,以及分布式的、share-nothing 的、容灾的、高可用的NDB数据库的组合,被称为MySQL集群((MySQL
Cluster)。

MyISAM和InnoDB的区别是什么?

MyISAM引擎是5.1版本之前的默认引擎,支持全文检索、压缩、空间函数等,但是不支持事务和行级锁,所以一般用于有大量查询少量插入的场景来使用,而且MyISAM不支持外键,并且索引和数据是分开存储的。

InnoDB是基于聚簇索引建立的,和MyISAM相反它支持事务、外键,并且通过MVCC来支持高并发,索引和数据存储在一起。

请概述下数据库的范式设计

目前关系数据库有六种范式,常见范式:第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。。

范式化设计优缺点:

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

反范式化:

优点:可以减少表得关联,可以更好得进行索引优化;缺点:数据冗余以及数据异常,数据得修改需要更多的成本,常见的反范式设计有缓存、冗余等等。

数据库表设计时,字段你会如何选择?

更小的通常更好,应该尽量使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期也更少。但是要确保没有低估需要存储的值的范围。

简单就好,简单数据类型的操作通常需要更少的CPU周期。例如,整型比字符操作代价更低,比如应该使用MySQL内建的类型而不是字符串来存储日期和时间。

尽量避免NULL,如果查询中包含可为NULL的列,对MySQL来说更难优化,因为可为NULL的列使得索引、索引统计和值比较都更复杂。可为NULL的列会使用更多的存储空间,在MySQL里也需要特殊处理。当可为NULL的列被索引时,每个索引记录需要一个额外的字节。

mysql里记录货币用什么字段类型好?

MySQL既支持精确类型的存储DECIMAL类型,也支持不精确类型存储FLOAT和 DOUBLE类型。对于货币记录,应该选择DECIMAL类型,但是DECIMAL类型是以字符串形式存放的,所以性能会有影响。

作为替代方案,可以在数据量比较大的而且要求精度时,虑使用BIGINT代替DECIMAL,将需要存储的货币单位根据小数的位数乘以相应的倍数即可。

总结

通过对MySQL的多种存储引擎进行了深入探讨,我们可以看到每种引擎都有其独特的特点和应用场景。InnoDB和MyISAM作为最常用的存储引擎,有着明显的差异和各自的优势。在数据库设计中,我们还探讨了范式设计的重要性和它的优缺点,强调了在设计数据库表时选择正确字段类型的重要性。

我们了解到,范式设计可以帮助我们创建结构良好、无冗余的数据库,而正确的字段选择可以优化数据库的性能并保证数据的一致性。特别是在处理货币类型的数据时,选择正确的字段类型是非常关键的。

通过深入探讨MySQL的这些核心概念和特性,我们不仅可以更好地理解MySQL数据库的工作原理,还可以学会如何优化数据库设计来满足特定的应用需求和优化性能。希望这篇文章能为您提供一个全面的视角,帮助您在使用MySQL时做出更明智的决策。

热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力

你可能感兴趣的:(面试汇总,mysql,adb,数据库)