MySQL查询缓慢的缘由,以及解决数据库N+1查询问题

1.select name from user where name is null; 与 select name from user where name is 0 哪种快?

毫无疑问当然第二条优于第一条。因为where查询语句中出现了null,这会导致查询时使用不到索引,取而代之的是进行全表查询。如果用0代替null查询速度就会快很多。

2.select * 相当于全表查询,应当采取select name, age精准查询,需要用到什么字段就查什么字段。

3.数据量庞大的时候未使用索引。

4.数据库发生死锁现象。其指的是2个或2个以上的SQL语句,同时查询同一个数据表,当第一条SQL语句查询时,就把数据表给锁住了。就会造成剩下的SQL语句不能查询此数据表而导致一直等待。如果没有人员去解决此问题,就会一直处于这种状态,所以称之为死锁。

如何解决?一般都是bug造成死锁现象。检查代码,修复bug。

 

N+1查询问题

数据表如下

user表:user_id,name,course_id

course表:course_id, name

需求是得到以下结构:

[
    {
        "id": 1, "name": "simple", "course_id": 1, "course":{"course_id": 1, "name": 'english'}
    }
],

1.循环查询:首先查询用户列表,然后循环用户列表查询对应的课程信息

$users = "select * from user";

foreach($users as $user) {

    $users['course'] = "select * from course where id = " .$user['course_id'];

}

此方法是一次查询列表,N次查询课程,性能最低。

2.连表查询

$users = "select * from user as u join course as c on c.course_id = u.course_id";

这种方法有局限性,如果该两张表不在同一个服务器是不可以连表的。

3.1+1查询

流程:先查询1次用户列表、取出列表中的课程ID组成数组、查询课程、合并数据

$users = "select * from user";

$course_ids = [];

foreach($users as $user) {

   if(!in_array($user['course_id'], $course_ids)){

       $course_ids[] = $user['course_id'];

   }

}

$courses = "select * from course where id in ('.join(',', $course_id).')";

$map = [];

foreach($courses as $course) {

    $map[$course['course_id']] = $course;

}

foreach($users as $user) {

    $map['course'] = $map[$user['course_id']] ?? null;

}

此方法在目前微服务流行的情况下是比较好的一种做法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值