[通用]计算机经典面试题基础篇Day3
1、请说明mysql的两种主要引擎
MySQL有多种存储引擎,但最常见的两种主要引擎是InnoDB和MyISAM。
2、说一下mysql这两种引擎的使用场景
MySQL的两种主要引擎,InnoDB和MyISAM,各自适用于不同的使用场景,以下是它们的主要用途和适合的应用场景:
- InnoDB引擎:
- 事务支持:InnoDB是MySQL的默认事务存储引擎,因此它非常适合需要事务支持的应用程序,例如电子商务网站、银行系统、订单处理系统等。它确保了数据的一致性和完整性,以及事务的原子性、一致性、隔离性和持久性(ACID属性)。
- 高并发性能:InnoDB支持行级锁定,这使得多个并发用户可以同时访问同一表的不同行,从而提高了并发性能。这对于具有大量同时在线用户的应用程序非常重要。
- 外键约束:如果您的数据库需要维护表之间的关系和引用完整性,InnoDB是更好的选择,因为它支持外键约束。
适合的应用场景:
- 事务性应用程序
- 高并发读写操作
- 需要外键支持的应用
- 数据完整性和一致性要求较高的应用
- MyISAM引擎:
- 读密集应用:MyISAM在处理大量读操作时表现得相当不错。因为它使用表级锁定,所以在并发写入操作较少的情况下,适合用于读取密集型应用程序,如博客、新闻网站、数据仓库等。
- 不需要事务支持:MyISAM不支持事务,因此对于不要求ACID属性的应用程序,可以考虑使用它。如果数据的一致性和完整性对应用程序不是关键问题,而且性能是首要考虑因素,那么MyISAM可能是一个选择。
- 临时表:MyISAM通常用于创建临时表,用于存储中间结果或缓存数据。
适合的应用场景:
- 读密集型应用
- 简单的查询和报表生成
- 不需要事务支持的应用
- 临时表和缓存需求
3、你认为mysql的优化方式都有什么
- 合适的索引设计:
- 创建适当的索引可以大大提高查询性能。确保表中的字段经过良好选择和规划,以便在常见的查询中使用索引。
- 查询优化:
- 使用合适的SQL查询,避免使用SELECT *,只选择所需的列,尽量减少数据传输。
- 使用EXPLAIN来分析查询执行计划,以便优化查询。
- 硬件优化:
- 使用高性能硬件,包括快速磁盘、大内存和多核处理器,以提高数据库服务器的性能。
- 使用SSD来加速磁盘I/O操作,以减少读写延迟。
- 调整缓冲区:
- 调整MySQL的缓冲区参数,如缓冲池大小、查询缓存等,以确保数据在内存中得到良好的管理和访问。
- 分区和分表:
- 对于大型表,可以考虑分区或分表,将数据分割成更小的部分,以提高查询性能。
- 定期维护:
- 定期进行数据库维护,包括优化表、重建索引、清理不再使用的数据,以保持数据库性能。
- 使用合适的存储引擎:
- 根据应用需求选择合适的存储引擎,如InnoDB或MyISAM,以满足事务性或读写需求。
- 分布式架构:
- 对于高负载应用程序,考虑采用分布式数据库架构,如MySQL集群或分片,以实现水平扩展。
- 查询缓存和缓存层:
- 使用查询缓存或缓存层,如Memcached或Redis,以减轻数据库服务器的负载。
- 监控和日志分析:
- 使用监控工具和日志分析来跟踪数据库性能,及时发现并解决问题。
- SQL优化器提示:
- 使用SQL_HINTS来指导MySQL优化器执行查询。这可以通过索引提示、查询缓存提示等来实现。
- 连接池管理:
- 使用连接池来管理数据库连接,以减少连接开销和提高并发性能。
- 优化表结构:
- 考虑使用合适的数据类型、避免NULL值、规范化数据,以减少数据存储和提高查询性能。
- 备份和恢复策略:
- 建立有效的备份和恢复策略,以防止数据丢失或硬件故障。
4、什么查询条件的索引会失效
- 使用函数或表达式 :如果在查询条件中使用了函数或表达式,通常会导致索引失效。例如,
WHERE YEAR(date_column) = 2023
,这会使索引失效,因为数据库无法直接使用索引来查找年份。- 对索引列进行了类型转换:如果查询中对索引列进行了类型转换,比如将整数列强制转换为字符列,索引可能会失效。
- 使用通配符在索引列开头进行模糊搜索 :当在索引列的开头使用通配符(如
LIKE '%keyword'
)时,索引通常不会被有效使用。通配符在开头会使索引失效,因为数据库无法快速定位匹配项。- 使用NOT操作符 :使用
NOT
操作符来否定查询条件时,索引可能会失效。例如,WHERE NOT column_name = 'value'
。- 使用OR操作符 :当使用
OR
操作符连接多个条件时,如果其中一个条件无法使用索引,整个查询可能会导致索引失效。- 使用不等于操作符(!=或<>):在某些情况下,使用不等于操作符进行过滤可能导致索引失效,特别是当不等于操作符涵盖大部分数据时。
- 数据分布不均匀:如果数据在索引列上分布不均匀,即某些值出现频率非常高,而其他值很少出现,那么对于频繁出现的值,索引可能不会被使用。
- 索引列参与了计算 :如果查询中的条件涉及到对索引列进行计算,索引可能会失效。例如,
WHERE column1 * 2 = 10
。- 表太小:对于非常小的表,使用索引可能不会提供明显的性能提升,因为数据库引擎可能选择全表扫描来更快地获取数据。
- 数据类型不匹配:如果查询条件中的数据类型与索引列的数据类型不匹配,索引可能会失效。
5、说一下mysql的索引分类
- B树索引(B-tree Index):
- B树索引是MySQL中最常见的索引类型,也是默认的索引类型。
- 它适用于等值查询、范围查询和排序操作。
- B树索引适用于大多数数据类型,包括数字、字符串和日期等。
- InnoDB存储引擎的默认索引类型是B树索引。
- 哈希索引(Hash Index):
- 哈希索引适用于等值查询,即只能用于精确匹配。
- 它在特定场景下可以提供非常快的查询速度,但不适用于范围查询或排序操作。
- 哈希索引通常用于Memory存储引擎中,不支持持久性存储。
- 全文索引(Full-Text Index):
- 全文索引适用于文本数据,用于实现全文搜索。
- 它可以处理包含单词的文本字段,并支持高级搜索和排序功能。
- MyISAM和InnoDB存储引擎都支持全文索引,但MyISAM的全文索引功能更为强大。
- 空间索引(Spatial Index):
- 空间索引适用于处理地理空间数据,如坐标点、线、面等。
- 它支持空间几何操作,如包含、相交、距离计算等。
- MySQL使用R-tree索引来实现空间索引,支持InnoDB和MyISAM存储引擎。
- 前缀索引(Prefix Index):
- 前缀索引是对列的前N个字符创建的索引,而不是整个列。
- 它可以用于减小索引的大小和提高查询性能,但可能会牺牲精确性。
- 前缀索引通常用于处理较长的文本列。
- 复合索引(Composite Index):
- 复合索引是将多个列组合到一个索引中,以支持多列查询。
- 它可以提高多列条件查询的性能,但要谨慎设计,以确保最佳的性能。
- 复合索引的顺序和选择哪些列非常重要。
- 唯一索引(Unique Index):
- 唯一索引确保索引列中的值是唯一的,不允许重复值。
- 唯一索引可用于实现主键或唯一性约束。
- 在插入或更新数据时,MySQL会检查唯一索引以确保数据的唯一性。
- 主键索引(Primary Key Index):
- 主键索引是一种特殊的唯一索引,用于唯一标识表中的每一行。
- 每个表只能有一个主键索引,通常与主键列一起定义。
- 主键索引是表的物理排序顺序,因此查询主键列通常非常高效。
6、列举几个linux的使用命令
- ls:列出当前目录中的文件和子目录。
bashls
- pwd:显示当前工作目录的路径。
bashpwd
- cd:更改当前目录。
bashcd /path/to/directory
- mkdir:创建新目录。
bashmkdir new_directory
- touch:创建新文件或更新文件的时间戳。
bashtouch filename
- cp:复制文件或目录。
bashcp source_file destination
- mv:移动文件或重命名文件。
bashmv old_name new_name
- rm:删除文件或目录。
bashrm filename
- cat:显示文件内容。
bashcat filename
- less:逐页查看文件内容。
bashless filename
- head:显示文件的前几行。
bashhead -n 10 filename
- tail:显示文件的最后几行。
bashtail -n 10 filename
- grep:在文件中搜索文本模式。
bashgrep pattern filename
- ps:显示正在运行的进程。
bashps aux
- kill:终止运行中的进程。
bashkill process_id
- ifconfig:显示网络接口信息。
bashifconfig
- ping:测试与远程主机的网络连接。
bashping remote_host
- ssh:通过SSH协议远程登录到另一台计算机。
bashssh username@hostname
- top:实时显示系统的资源使用情况和运行中的进程。
bashtop
- tar:创建或解压归档文件(通常是.tar.gz或.tar.bz2文件)。
bashtar -zxvf archive.tar.gz
7、linux中 > 和 >> 的区别,常用查看日志命令
在Linux中,
>
和>>
是用于重定向输出的特殊符号,它们有以下区别:
- >:
>
符号用于将命令的输出重定向到一个文件,如果目标文件已存在,则会覆盖原有内容。- 例如:
command > file
将命令的输出写入到名为file
的文件中。如果文件不存在,则会创建一个新文件,如果文件已存在,则会清空原有内容并写入新的输出。示例:
bashecho "Hello, World!" > output.txt
这会创建一个新文件
output.txt
,并将字符串 "Hello, World!" 写入其中。
- >>:
>>
符号也用于将命令的输出重定向到一个文件,但与>
不同的是,如果目标文件已存在,>>
会将新的输出追加到现有内容的后面。- 例如:
command >> file
将命令的输出追加到名为file
的文件的末尾。示例:
bashecho "Appended text." >> output.txt
这会在已存在的
output.txt
文件末尾追加文本 "Appended text."。常用查看日志的命令:
- cat:
cat
命令用于显示文件的内容。可以用于查看小型文件的内容。示例:
bashcat filename
- less:
less
是一个分页查看器,可以用于逐页查看大型文件,同时提供搜索和浏览功能。示例:
bashless filename
在
less
中,可以使用箭头键上下滚动,按/
键进行搜索,按q
键退出。
- tail:
tail
命令用于显示文件的末尾几行,默认情况下显示最后10行。示例:
bashtail filenameb
可以使用
-n
选项指定显示的行数,例如tail -n 20 filename
会显示最后的20行。
- head:
head
命令用于显示文件的开头几行,默认情况下显示前10行。示例:
bashhead filename
可以使用
-n
选项指定显示的行数,例如head -n 20 filename
会显示前20行。
8、说一下你对scp命令的理解
SCP(Secure Copy Protocol)是一个用于在不同系统之间安全复制文件和目录的命令行工具。它建立在SSH协议之上,提供了数据加密和认证,因此数据传输是安全的。
SCP命令的基本语法如下:
bashscp [options] source destination
source
:要复制的文件或目录的源路径。可以是本地文件系统路径或远程主机上的文件路径。如果是远程路径,通常以user@host:source_path
的形式指定,其中user
是远程主机上的用户名,host
是远程主机的主机名或IP地址,source_path
是源文件或目录的路径。destination
:复制的目标路径。同样,可以是本地文件系统路径或远程主机上的路径。如果是远程路径,也以user@host:destination_path
的形式指定。常用的SCP选项包括:
-r
:递归复制,用于复制目录及其内容。-P
:指定远程SSH端口号。-i
:指定用于身份验证的私钥文件。-v
:启用详细的输出,用于调试目的。SCP的一些常见用途包括:
- 从本地系统向远程主机复制文件或目录:
bashscp local_file user@remote_host:remote_path
- 从远程主机复制文件或目录到本地系统:
bashscp user@remote_host:remote_file local_path
- 在远程主机之间复制文件或目录:
bashscp user1@remote_host1:source_path user2@remote_host2:destination_path
- 使用不同的SSH端口号:
bashscp -P 2222 local_file user@remote_host:remote_path
9、说一下你对tar命令的理解
tar
(tape archive)是一个常用的命令行工具,用于在Unix和Linux系统中创建、查看、提取和压缩文件和目录的归档文件。tar
命令通常用于将多个文件和目录打包成单个文件,以便进行备份、传输或存档。以下是我对tar
命令的理解:
tar
命令的基本语法如下:
bashtar [选项] [目标] [源]
常见的
tar
选项包括:
-c
:创建新的归档文件。-x
:从归档文件中提取文件。-t
:列出归档文件中的文件列表。-f
:指定归档文件的名称。-v
:显示详细信息,通常用于显示提取或创建的文件列表。-z
:使用gzip进行压缩/解压缩。-j
:使用bzip2进行压缩/解压缩。-C
:在提取文件时指定目标目录。一些常见的
tar
命令示例:
- 创建归档文件:
bashtar -cvf archive.tar file1 file2 directory1
这将创建名为
archive.tar
的归档文件,包含了file1
、file2
和directory1
。
- 提取归档文件:
bashtar -xvf archive.tar
这将从
archive.tar
中提取所有文件和目录。
- 查看归档文件中的内容:
bashtar -tvf archive.tar
这将列出
archive.tar
中的文件列表。
- 使用gzip压缩:
bashtar -czvf archive.tar.gz directory1
这将使用gzip对
directory1
进行压缩,并创建名为archive.tar.gz
的归档文件。
- 解压缩gzip压缩的归档文件:
bashtar -xzvf archive.tar.gz
这将解压缩
archive.tar.gz
并提取其中的文件。
tar
命令非常有用,可以用于备份、迁移文件、创建软件分发包等任务。它是Unix和Linux系统中的标准工具之一,具有丰富的选项和功能,可根据需要进行配置。要了解更多详细信息,可以查看tar
命令的手册页,使用man tar
命令。