【MySQL】链接查询中索引的重要性

在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