多表外连接性能测试及优化

来源:互联网 发布:java if else 都执行 编辑:程序博客网 时间:2024/06/12 07:11

转载:http://blog.csdn.net/tang_huan_11/article/details/41925639

前提:数据库中一共有三个表:class,book,phone,而且每个数据库表中都有10万条数据,三个表一共有30万条数据,从大数据量的角度来检测你写的sql语句性能是如何的.

一.左连接

sql语句查询前10000条数据,sql语句表示如下:

[sql] view plain copy
 print?
  1. select  * from class LEFT JOIN book on class.card=book.card limit 10000  
查询时间为:

explain检测性能,语句为:

[sql] view plain copy
 print?
  1. EXPLAIN  
  2. select  * from class LEFT JOIN book on class.card=book.card limit 10000  
其结果:

从此我们可以看出两个的type都是all ,其中class表需要检测的行数是100398,book表需要检测的行数是100453,可以看出这是一个多么大的工程.

book表中插入索引:

[sql] view plain copy
 print?
  1. ALTER TABLE `book` ADD INDEX y ( `card`);  

其结果为:


查询时间为:

查询速度是没有添加索引时的31.6,那么再来看看它的性能


从结果中,我们可以看出第二行的type变成了ref ,其中rows也从原来的100453变成了523.优化的比较明显.leftjoin条件用于确定如何从右表搜索行,左边一定都有,所以右边是我们的关键点,一定需要建立索引.

删除旧索引,建立class表的新索引

[sql] view plain copy
 print?
  1. DROP INDEX y ON book;  
  2. ALTER TABLE `class` ADD INDEX x ( `card`);  

SQL语句执行所需要的时间:

查询时间和未添加索引的时候索引值差不错.

那看看性能:

Class表的type变成了index,还是很糟糕的,而且两个表的rows都是100453,这还是一个很大工程.

 

二.右连接

其中还是保持class表中的card字段建立索引,sql语句为:

[sql] view plain copy
 print?
  1. select  * from class RIGHT  JOIN book on class.card=book.card limit 10000  
执行时间为:

其性能为:


    优化较明显,这是因为Right join是先执行book表,在执行class表格,right join条件用于确定如何从左表搜索行,右边一定都有,所以左边是我们的关键点,一定需要建立索引.


删除就索引,book表中建立新索引:

[sql] view plain copy
 print?
  1. DROP INDEX y ON book;  
  2. ALTER TABLE `book` ADD INDEX y ( `card`);  

sql语句查询时间为:

sql语句性能:

其情况和两个表都不添加索引的没有多大的变化.

 

三.内连接

最后来看看inner join的情况,book表的card字段建立了索引,class表未建立索引,sql语句:

select  * from class INNER  JOIN book on class.card=book.card limit 10000

sql语句执行时间:

其性能:


再在class表中建立索引试试:

[sql] view plain copy
 print?
  1. ALTER TABLE `class` ADD INDEX x ( `card`);  

其查询时间为:


查询时间没有多大变化,但是sql语句的性能呢?


结果是没有多大的变化.

 

从以上的测试我们可以得出:

inner join left join差不多,都需要优化右表。而 right join需要优化左表。


四.三表连接

那三个表又该如何优化呢?三个都无索引的时候,sql查询语句如下:

[sql] view plain copy
 print?
  1. select * from class left join book on class.card=book.card   
  2. left join phone on book.card = phone.card  
  3.   
  4. limit  10000  

查询时间:

还在可以接受的范围内.

其性能:

从结果可以看出,结果并不太理想.再来看看添加索引的情况

分别给phone表和book,class表添加索引,sql语句如下:

[sql] view plain copy
 print?
  1. ALTER TABLE `class` ADD INDEX x ( `card`);  
  2. ALTER TABLE `phone` ADD INDEX z ( `card`);  
  3. ALTER TABLE `book` ADD INDEX y ( `card`);  

查询时间为:

 其性能为:

    最后两行的type都是ref ,rows的值是500左右,优化效果还是很不错的.

 

    在建立数据的初期,可以根据业务的需要,适当的建立索引还是很有必要的,适当的索引可以大大提高sql语句的性能.