面试题之数据库篇

本贴最后更新于 886 天前,其中的信息可能已经事过景迁

渐进式问题

有两个表:学生 student(id,name,age,class_id)和班级 class(id,name)。

口述查询语句:查询人数大于 10 的班级,及其人数

  • select class.id, count(*) from class join student on class.id = student.class_id group by class.id having count(*) > 10;

左连接,右连接和内连接的区别

  • 连接分为内连接和外连接,外连接又分为左外连接和右外连接。比如表 1 join 表 2,在字段 a 上做关联,如果是左外连接,会把所有表 1 的记录查询出来,对应字段 a 的值,如果在表 2 中没有记录,表 2 相关字段会都是 null;而如果是右外连接,会把表 2 的记录都查询出来,对应字段 a 的值,如果在表 1 中没有记录,表 1 相关字段会都是 null;如果是内连接,会把这类只有一个表里有的记录过滤掉。

单纯的 join 关键字,是哪种连接方式

  • 是内连接方式

口述查询语句:查询年龄大于 15 且姓李的学生

  • select * from student where age > 15 and name like '李%';

针对这个查询,如何给学生表加索引

  • 增加索引 idx_age_name (age, name)

能不能把索引的两个字段换顺序?为什么?

  • 不能换
  • 按照索引查询时,遵循前缀匹配原则,查询语句中有对 name 字段的前缀匹配,如果把 name 字段放到第一位,则不能再按 age 走索引,只能查到 name 前缀是"李"的记录后遍历所有的记录。而如果把 age 放到第一位,则可以按索引直接找到 age>15 且 name 前缀是"李"的第一条记录,再顺序读取后续记录,直到第一个不符合条件的记录,即可返回,遍历的记录条数会更少。

如何看查询语句是否使用了索引?

  • 使用 explain 关键字,可以看查询语句的执行过程

MySQL 数据库,同一条查询语句,第一次执行较慢,第二次很快返回结果,可能的原因是什么?

  • 可能是第二次查询时命中了查询缓存
  • 如果开启了查询缓存,且在第一次查询后没有对查询相关表做任何修改操作,则第二次查询时会直接返回缓存的第一次查询的结果
  • 只有在更新不频繁的场景才建议开启查询缓存,因为缓存查询结果会占用一定内存,且有性能损失,如果更新频繁,缓存往往不能命中,则会白白浪费内存和性能
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖 • 2 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    330 引用 • 614 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...