多表外连接性能测试及优化
2017-08-07 16:09
267 查看
转载:http://blog.csdn.net/tang_huan_11/article/details/41925639
前提:数据库中一共有三个表:class,book,phone,而且每个数据库表中都有10万条数据,三个表一共有30万条数据,从大数据量的角度来检测你写的sql语句性能是如何的.
[sql] view
plain copy
print?
select * from class LEFT JOIN book on class.card=book.card limit 10000
查询时间为:
用explain检测性能,语句为:
[sql] view
plain copy
print?
EXPLAIN
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?
ALTER TABLE `book` ADD INDEX y ( `card`);
其结果为:
查询时间为:
查询速度是没有添加索引时的31.6倍,那么再来看看它的性能
从结果中,我们可以看出第二行的type变成了ref
,其中rows也从原来的100453变成了523.优化的比较明显.leftjoin条件用于确定如何从右表搜索行,左边一定都有,所以右边是我们的关键点,一定需要建立索引.
删除旧索引,建立class表的新索引
[sql] view
plain copy
print?
DROP INDEX y ON book;
ALTER TABLE `class` ADD INDEX x ( `card`);
SQL语句执行所需要的时间:
查询时间和未添加索引的时候索引值差不错.
那看看性能:
Class表的type变成了index,还是很糟糕的,而且两个表的rows都是100453,这还是一个很大工程.
[sql] view
plain copy
print?
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?
DROP INDEX y ON book;
ALTER TABLE `book` ADD INDEX y ( `card`);
其sql语句查询时间为:
其sql语句性能:
其情况和两个表都不添加索引的没有多大的变化.
select * from class INNER JOIN book on class.card=book.card limit 10000
sql语句执行时间:
其性能:
再在class表中建立索引试试:
[sql] view
plain copy
print?
ALTER TABLE `class` ADD INDEX x ( `card`);
其查询时间为:
查询时间没有多大变化,但是sql语句的性能呢?
结果是没有多大的变化.
从以上的测试我们可以得出:
inner join和 left join差不多,都需要优化右表。而 right
join需要优化左表。
[sql] view
plain copy
print?
select * from class left join book on class.card=book.card
left join phone on book.card = phone.card
limit 10000
查询时间:
还在可以接受的范围内.
其性能:
从结果可以看出,结果并不太理想.再来看看添加索引的情况
分别给phone表和book表,class表添加索引,sql语句如下:
[sql] view
plain copy
print?
ALTER TABLE `class` ADD INDEX x ( `card`);
ALTER TABLE `phone` ADD INDEX z ( `card`);
ALTER TABLE `book` ADD INDEX y ( `card`);
查询时间为:
其性能为:
最后两行的type都是ref
,且rows的值是500左右,优化效果还是很不错的.
在建立数据的初期,可以根据业务的需要,适当的建立索引还是很有必要的,适当的索引可以大大提高sql语句的性能.
前提:数据库中一共有三个表:class,book,phone,而且每个数据库表中都有10万条数据,三个表一共有30万条数据,从大数据量的角度来检测你写的sql语句性能是如何的.
一.左连接
用sql语句查询前10000条数据,sql语句表示如下:[sql] view
plain copy
print?
select * from class LEFT JOIN book on class.card=book.card limit 10000
查询时间为:
用explain检测性能,语句为:
[sql] view
plain copy
print?
EXPLAIN
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?
ALTER TABLE `book` ADD INDEX y ( `card`);
其结果为:
查询时间为:
查询速度是没有添加索引时的31.6倍,那么再来看看它的性能
从结果中,我们可以看出第二行的type变成了ref
,其中rows也从原来的100453变成了523.优化的比较明显.leftjoin条件用于确定如何从右表搜索行,左边一定都有,所以右边是我们的关键点,一定需要建立索引.
删除旧索引,建立class表的新索引
[sql] view
plain copy
print?
DROP INDEX y ON book;
ALTER TABLE `class` ADD INDEX x ( `card`);
SQL语句执行所需要的时间:
查询时间和未添加索引的时候索引值差不错.
那看看性能:
Class表的type变成了index,还是很糟糕的,而且两个表的rows都是100453,这还是一个很大工程.
二.右连接
其中还是保持class表中的card字段建立索引,其sql语句为:[sql] view
plain copy
print?
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?
DROP INDEX y ON book;
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?
ALTER TABLE `class` ADD INDEX x ( `card`);
其查询时间为:
查询时间没有多大变化,但是sql语句的性能呢?
结果是没有多大的变化.
从以上的测试我们可以得出:
inner join和 left join差不多,都需要优化右表。而 right
join需要优化左表。
四.三表连接
那三个表又该如何优化呢?三个都无索引的时候,sql查询语句如下:[sql] view
plain copy
print?
select * from class left join book on class.card=book.card
left join phone on book.card = phone.card
limit 10000
查询时间:
还在可以接受的范围内.
其性能:
从结果可以看出,结果并不太理想.再来看看添加索引的情况
分别给phone表和book表,class表添加索引,sql语句如下:
[sql] view
plain copy
print?
ALTER TABLE `class` ADD INDEX x ( `card`);
ALTER TABLE `phone` ADD INDEX z ( `card`);
ALTER TABLE `book` ADD INDEX y ( `card`);
查询时间为:
其性能为:
最后两行的type都是ref
,且rows的值是500左右,优化效果还是很不错的.
在建立数据的初期,可以根据业务的需要,适当的建立索引还是很有必要的,适当的索引可以大大提高sql语句的性能.
相关文章推荐
- 多表外连接性能测试及优化
- Jmeter分布式部署测试-----远程连接多台电脑做压力性能测试
- 三张图看遍Linux 性能监控、测试、优化工具
- Linux 性能监控、测试、优化工具测试
- 三张图看遍Linux 性能监控、测试、优化工具
- 亿能提供的性能测试诊断分析与优化
- 三张图看遍Linux 性能监控、测试、优化工具
- MongoDB性能优化之连接优化
- 性能测试、指标和优化 -- 性能相关总结
- 聊聊性能测试、操作系统优化对性能测试的影响,以及如何优化操作系统
- Hbase性能测试及优化过程记
- Oracle 多表 连接 顺序 与 性能关系 测试
- NodeJS性能测试及优化相关资料
- oracle技术之提高短连接性能方法测试
- Mali GPU OpenGL ES 应用性能优化--测试+定位+优化流程
- 优化系列 | MySQL 5.6.10 vs Percona 5.6.6之TPCCC性能测试
- Linux 性能监控、测试、优化工具
- 性能测试之Tomcat优化
- 使用socket方式连接Nginx优化php-fpm性能
- .net性能测试和优化2 Profiling和提高的一些参考