第十章:第25节 MySQL进阶篇——基本查询与多表连接查询的选择

更新于:2021-09-07 10:42:59

在上一章介绍数据的查询时,除了基本查询,我们还认识了连接查询、子查询、联合查询。可楠神在这一章却没有介绍到另外的几种查询方式,尤其是连接查询下使用索引的情况。这是因为基本查询能理解透就挺不错了,连接查询更不好理解,而且连接查询并不一定能很好的使用到索引。这也和楠神自己本身编程习惯有关系,就是我在开发项目时,只用基本查询,是极少用像连接查询这样的一条SQL语句涉及到多表查询。


在一些复杂的项目中,可能某个功能会从多个表读数据,本可以一条连接查询语句楠神会拆分成多条基本查询,配合PHP的for循环读取数据。例如:一个学生表student,一个班级表class,从这两张表完整地读取学生信息。连接查询是这样写


select s.id,s.name,c.name class_name from student s left join class c on s.class_id = s.id;


可楠神不用连接查询写,拆分


select id,name,class_id from student; //获取的结果集是个数组$student_arr


紧接着


foreach($student_arr as $key=>$val){ //循环

  select name from class where id = $val['class_id']; //获取班级名

  $student_arr[$key]['class_name'] = $name;

}


大家觉着这两种方式哪种好?哪种效率高?


可能有朋友会觉着:

假如有100个学生,第一种方法只用一条SQL语句就可以了,第二种方法需要101条SQL语句。

假如有1000个学生,第一种方法也只用一条SQL语句就可以了,第二种方法需要1001条SQL语句。

……

总结:第二种方法SQL语句太多,IO读频率高,还是第一种方法好。


楠神倒觉着还是第二种方法更好一点,我的观点:


1)在数据量小的情况下没什么差别,数据量非常大的情况下,连接查询有时会很慢,远没有基本查询快,【索引】更容易被用到。


2)连接查询多了,更容易造成【锁冲突】。


3)MySQL也是有缓存机制的,基本查询更容易用到缓存,连接查询用到MySQL的【缓存概率低】。


4)基本查询更【易读】,等于是拆分了的连接查询。


就像上面的例子,假如只有5个班级,我们从班级表读数据时,是不是只需要读5次就可以了。也就是已经获取到某个班级信息,其他同学是可以复用的,就没有必要再往MySQL发指令了,总的发往MySQL的语句最多只有5条。


我们可以把上面的for循环改下,加个判断:


foreach($student_arr as $key=>$val){ //循环

  if(通过班级ID判断是否已获取,如果没获取到,再发往MySQL select语句){

      select name from class where id = $val['class_id']; //获取班级名

  }

  $student_arr[$key]['class_name'] = $name;

}


下面两张图片,从网上搜到的相关资料,可供大家参考去选择以后写项目是用连接查询还是基本查询:


800.jpg


800.jpg