渐进式问题
有两个表:学生 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 数据库,同一条查询语句,第一次执行较慢,第二次很快返回结果,可能的原因是什么?
- 可能是第二次查询时命中了查询缓存
- 如果开启了查询缓存,且在第一次查询后没有对查询相关表做任何修改操作,则第二次查询时会直接返回缓存的第一次查询的结果
- 只有在更新不频繁的场景才建议开启查询缓存,因为缓存查询结果会占用一定内存,且有性能损失,如果更新频繁,缓存往往不能命中,则会白白浪费内存和性能
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于