MySQL试题

本文深入探讨了MySQL数据库的优化方法,包括SQL语句、表结构和系统配置等方面的优化策略。同时,详细介绍了MySQL中的不同锁机制及其应用场景,帮助读者理解如何通过合理的锁策略提升数据库性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 简述在MySQL数据库中引擎MyISAM和InnoDB的区别?

  1. 存储结构方面:MyISAM每个MyISAM在磁盘上存储成三个文件.frm文件存储表定义、数据文件的扩展名为.MYD、索引文件的扩展名是.MYI;InnoDB所有的表都保存在同一个数据文件中,表的大小只受限于操作系统文件的大小,一般为2GB。
  2. 存储空间方面:MyISAM可被压缩,存储空间较小。支持三种不同的存储格式:静态表、动态表、压缩表;InnoDB需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。
  3. 事务支持方面:MyISAM强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持;InnoDB提供事务支持事务。
  4. 表锁差异方面:MyISAM只支持表级锁;InnoDB支持事务和行级锁。
  5. 表主键:MyISAM允许没有任何索引和主键的表存在,索引都是保存行的地址。InnoDB如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键。
  6. 增删改查操作方面:如果执行大量的SELECT,MyISAM是更好的选择。如果执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。
  7. 外键方面:MyISAM不支持;InnoDB支持。

————————————————

2. MySQL中有哪几种锁?

  1. 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
  2. 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
  3. 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

————————————————

3. 什么是通用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): 将整数天数转换为日期值。

————————————————

4. MySQL中有哪些不同的表格?

MyISAM、Heap、Merge、INNODB、ISAM

5. CHAR和VARCHAR的区别?

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

6. MySQL中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?

  1. read uncommited :读到未提交数据
  2. read committed:脏读,不可重复读
  3. repeatable read:可重复读
  4. serializable :串行事务

7. myisamchk是用来做什么的?

它用来压缩 MyISAM 表,这减少了磁盘或内存使用。

8. 主键和候选键有什么区别?

  1. 表格的每一行都由主键唯一标识,一个表只有一个主键,主键也是候选键。按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用。

9. 如果一个表有一列定义为TIMESTAMP,将发生什么?

每当行被更改时,时间戳字段将获取当前时间戳。

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

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

11. MySQL 数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?

  1. 设计良好的数据库结构,允许部分数据冗余,尽量避免 join 查询,提高效率。
  2. 选择合适的表字段数据类型和存储引擎,适当的添加索引。
  3. MySQL 库主从读写分离。
  4. 找规律分表,减少单表中的数据量提高查询速度。
  5. 添加缓存机制,比如 redis,apc 等。
  6. 不经常改动的页面,生成静态页面。
  7. 书写高效率的SQL。比如 :SELECT * FROM TABEL改为SELECT field_1,field_2, field_3 FROM TABLE.

————————————————

12. LIKE 声明中的%和_是什么意思?

%对应于 0 个或更多字符,_只是 LIKE 语句中的一个字符。

13. 实践中如何优化 MySQL?

  1. 最好是按照以下顺序优化:
  2. SQL 语句及索引的优化
  3. 数据库表结构的优化
  4. 系统配置的优化
  5. 硬件的优化

 14. 优化数据库的方法?

  1. 选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置 NOTNULL,例如’省份’、’性别’最好适用枚举类型ENUM
  2. 使用连接(JOIN)来代替子查询
  3. 适用联合(UNION)来代替手动创建的临时表
  4. 事务处理
  5. 锁定表、优化事务处理
  6. 适用外键,优化锁定表
  7. 建立索引
  8. 优化查询语句

15. 什么是非标准字符串类型?

TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT

 16. 什么是锁?

  1. 数据库是一个多用户使用的共享资源,当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。
  2. 若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并发控制的一个非常重要的技术。
  3. 当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。
  4. 加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
  5. 基本锁类型:锁包括行级锁和表级锁
     

17. 什么情况下设置了索引但无法使用?

  1. 以“%”开头的 LIKE 语句,模糊匹配
  2. OR 语句前后没有同时使用索引
  3. 数据类型出现隐式转化(如 varchar 不加单引号的话可能会自动转换为 int 型)

18. SQL注入漏洞产生的原因?如何防止?

SQL注入产生的原因:不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GE 提交一些sql语句正常执行。
防止SQL注入的方式:

  1. Sql语句书写尽量不要省略双引号和单引号。
  2. 过滤掉sql语句中的一些关键词:update、insert、delete、select、 * 。
  3. 提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。
  4. 对于常用的方法加以封装,避免直接暴漏SQL语句

 19. SQL 语言包括哪几部分?每部分都有哪些操作关键字?

  1. SQL 语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)
  2. 数据定义(DDL)的关键字主要有:Create Table、Alter Table、Drop Table、Craete/Drop Index等
  3. 数据操纵(DML)的关键字主要有:Select 、insert、update、delete,
  4. 数据控制(DCL)的关键字主要有:grant、revoke
  5. 数据查询(DQL)的关键字主要有:select

20. 锁的优化策略?

  1. 读写分离
  2. 分段加锁
  3. 减少锁持有的时间
  4. 多个线程尽量以相同的顺序去获取资源不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值