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

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

一.左连接

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

select  * from class LEFT JOIN book on class.card=book.card limit 10000
查询时间为:

explain检测性能,语句为:

EXPLAIN
select  * from class LEFT JOIN book on class.card=book.card limit 10000
其结果:

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

book表中插入索引:

ALTER TABLE `book` ADD INDEX y ( `card`);

其结果为:


查询时间为:

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


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

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

DROP INDEX y ON book;
ALTER TABLE `class` ADD INDEX x ( `card`);

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

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

那看看性能:

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

 

二.右连接

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

select  * from class RIGHT  JOIN book on class.card=book.card limit 10000
执行时间为:

其性能为:


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


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

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表中建立索引试试:

ALTER TABLE `class` ADD INDEX x ( `card`);

其查询时间为:


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


结果是没有多大的变化.

 

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

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


四.三表连接

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

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语句如下:

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语句的性能.


  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论
在MySQL中,对多表关联的性能进行优化可以采取以下几个方法: 1. 确保适当的索引:为参与关联的列创建索引,特别是在关联列上创建索引。这将加快关联操作的速度并提高查询性能。 2. 使用合适的关联类型:根据实际需求选择适当的关联类型,如INNER JOIN、LEFT JOIN等。不同的关联类型适用于不同的情况,选择合适的关联类型可以提高查询效率。 3. 限制返回的列:只选择需要的列而不是使用通配符(*)选择所有列。这可以减少数据传输和处理的开销,提高查询性能。 4. 避免多余的关联:仔细审查查询逻辑,避免不必要的多表关联。只关联必要的表和列,减少不必要的数据处理和连接操作。 5. 使用临时表或子查询:在某些情况下,使用临时表或子查询可以提高多表关联查询的性能。通过将中间结果存储在临时表或子查询中,可以减少多次关联操作和数据传输。 6. 定期优化表结构:优化表结构、调整数据类型、删除无用的索引等可以提高多表关联查询的性能。使用EXPLAIN语句来分析查询计划,并根据其结果进行相应的优化。 7. 考虑分区表:如果数据量较大,可以考虑将表进行分区。通过将数据分散到多个分区中,可以提高查询性能。 这些是一些常见的方法,但优化的具体策略取决于具体的业务需求和数据库结构。建议根据实际情况进行性能测试和调优,并根据结果采取适当的优化措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弯_弯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值