在mysql中,咱们要从多张表中读取数据时,每每须要用到链接查询。链接查询经过两张表中符合链接关系的字段来创建两张表的关联,一般包括内链接、左外链接、右外链接和全链接。内链接会保留两张表中共有的那部分记录,所以最后产生的链接表记录数最少;全链接会保留两张表中全部的记录,所以最后产生的链接表记录数最多;而左外链接会保留左表的所有记录,右外链接会保留右表的所有记录,所以最后产生的链接表记录数处于内链接和外链接之间。mysql
下面咱们以一个学生选课的例子,来分析下左外链接的性能。sql
首先定义一张学生表(student):数据库
插入学生记录,共10000条:服务器
而后定义一张学生选课表(student_to_class):性能
插入学生选课记录,每一个学生选择2门课,共20000条记录:.net
如今咱们要统计每一个学生的我的信息,包括他的姓名和他选择的课程数,这样咱们须要使用左外链接,具体SQL以下:code
SELECT a.student_id, student_name, count(*) FROM student a LEFT JOIN student_to_class b ON a.student_id = b.student_id GROUP BY a.student_id;可是,这个查询的执行速度很是慢,花费了75.467s,固然这与我在本机,而不是在服务器上搭建数据库也有关系,可这样的查询效率确定不能忍受。
下面咱们来分析一下为何这么慢:blog
首先用explain查看这个语句的查询执行计划,能够看到type都为ALL,即在student表和student_to_class表中都使用的全表扫描,其中student表(a)中扫描了10649行,student_to_class表(b)中扫描了20287行,这样无疑效率是很是低的。索引
对此,咱们试着给student_to_class表的student_id字段添加索引:get
而后再次执行查询,发现速度很是快,只有0.077s,改进得很是多。而相应的查询执行计划以下图所示,发如今查询student_to_class表时使用了索引student_index,使得只须要扫描1行就好了,至关于原来的两万分之一,这就是效率改进的关键点所在。
所以,当链接查询时产生的链接表过大时,为了防止查询次数过多,咱们要常常使用索引来减小查询次数,提升查询效率。
转载请注明出处:http://blog.csdn.net/sunset108/article/details/41747189