索引和日志在数据库的高效运行和数据安全中扮演着重要角色。下面我们详细梳理索引和日志的相关知识,并通过练习题加深理解。
一、知识点梳理
(一)索引
(二)日志
二、练习题及解析
(一)选择题
A. 索引的数据结构是二叉树
B. 索引的数据结构是 B 树,数据保存在非叶子结点
C. 索引的数据结构是 B + 树,数据保存在叶子结点
D. 以上说法都不正确
答案:C
解析:索引的数据结构为 B + 树,其中 B 代表 Balance(平衡),数据保存在叶子结点中,所以 C 选项正确,A、B 选项错误。
A. 主键索引可以唯一标识一行数据
B. 一张表只能有一个主键索引
C. 主键索引允许为空
D. 主键索引在数据唯一性方面有重要作用
答案:C
解析:主键索引的特点是唯一标识一行,不允许为空,一张表只能有一个主键索引,A、B、D 选项正确,C 选项错误。
A. where 子句中使用索引列
B. 使用 like ‘内容 %’
C. 使用 like ‘% 内容’
D. join 操作中使用索引列
答案:C
解析:like ‘% 内容’可能导致索引失效,A、B、D 选项在正常情况下不会导致索引失效,所以选 C。
A. 记录数据库的更改操作
B. 实现事务的持久化,用于崩溃修复
C. 记录执行缓慢的 SQL 语句
D. 以上说法都不正确
答案:B
解析:redo 日志的作用是事务的持久化操作,崩溃修复,A 选项是 binary log 的作用,C 选项是慢查询日志的作用,所以 B 选项正确。
(二)简答题
答案:索引主要分为以下几类:
解析:不同类型的索引适用场景不同,主键索引和唯一索引保证数据唯一性,普通索引用于一般查询加速,联合索引适合多列查询,全文索引用于关键词搜索。
答案:适合建立索引的情况:where、join、order by 频繁使用的列;外键列,可加速表的连接。
应避免建立索引的情况:数据量较小的列;频繁更新的列(写性能低);性别等只有 2 个数据值的低基数列。
解析:建立索引的目的是加速查询,但对于数据量小、频繁更新或低基数的列,建立索引可能不会带来明显性能提升,甚至影响写性能,所以需合理选择。
答案:binary log(二进制日志)的作用是记录数据库的更改操作。
相关参数有:log_bin(日志前缀);expire_logs_days(自动清理过期日志,单位为天);server_id(编号)。
解析:binary log 主要用于数据恢复、主从复制等场景,通过相关参数可配置日志的存储和清理方式,server_id 用于标识服务器,在主从架构中很重要。
(三)案例分析题
现有一个员工表(employee),包含字段:id(员工编号)、name(姓名)、gender(性别)、age(年龄)、department(部门)、salary(工资)。
答案:create index idx_employee_name on employee (name);
解析:按照普通索引的创建格式,指定索引名称 idx_employee_name,表名为 employee,字段为 name。
答案:不合适。因为 gender 字段只有男、女两个值,属于低基数列,建立索引不能有效提升查询性能,反而会增加数据维护成本,降低写性能。
解析:低基数列的索引选择性差,查询时可能还是需要扫描大量数据,所以不适合建立索引。
答案:可以为 department 和 salary 字段创建一个联合索引,如 create index idx_dept_salary on employee (department, salary);
解析:该查询涉及 department 和 salary 两个字段,创建联合索引后,查询时可利用索引快速定位到部门为 “技术部” 且工资大于 8000 的记录,提高查询效率,符合联合索引在多列查询中的优化作用。