手抄报 安全手抄报 手抄报内容 手抄报图片 英语手抄报 清明节手抄报 节约用水手抄报

mysql 关联表很多 如何优化

时间:2024-10-26 09:19:00

1、mysql多表关联优化首先要寿伊趾杏考虑的是该关联查询的频繁程度、时效性要求等等,只有明确了具体需求才好作出最好的优化方式。下面举几个自身真实事例供你参考:1、该关联不需要频繁酴兑镗笄查询,一天(周、月)查询一到两次,时效性要求不高,只是需要查询相关业务或数据流当天(周、月)趋势;答:实际案例比如一些公司推送的日表、周表、月表、年报以及一些趋势图内等情况。由于时效性,紧急性要求不高,只需要在规定的时间内准确提供相关数据推送前端(或程序),不希望或者不能对原本需要多次关联的表结构做相关调整以及修改的情况下,可以通过增加相关索引来提高查询速度。在关联字段以及WHERE条件字段增加索引来提高mysql关联查询速度是非常普遍也是非常常用的一种方式,正确创建索引能够大幅度提高查询速度。可以看下图环境,创建了两表test1,test2;需要关联出test1中每条记录对应test2的数据,如果两表数据量都比较大,可以在两表的关联条件A.a=B.a中这两个字段增加索引,如果有WHERE条件的话也可以在WHERE条件所使用的字段增加相关索引以提高查询速度。

mysql 关联表很多 如何优化

2、增加索引之前我们来分析下mysql数据库会如何查询:EXPLAINSELECT A.a,A.b,B.b FROM test1 A INNER JOIN test2 B ON A.a=B.a ;可以看到,mysql数据库是进行全表扫描的方式来进行不断循环查询,效率会非常低下。

mysql 关联表很多 如何优化

3、咱们在关键字段添加索引再来分析下查询情况:CREATE INDEX IDX_test1_a ON test1(a);CREATE INDEX IDX_test2_a ON test2(a);EXPLAINSELECT A.a,A.b,B.b FROM test1 A INNER JOIN test2 B ON A.a=B.a ;我们可以看到,再使用同样的语句进行关联查询,数据库会使用刚才创建的两个普通索引来进行关联,虽然在本例中由于数据量非常少不太明显,但是一旦在真是环境特别的多表关联的情况下速度会提升很多。

mysql 关联表很多 如何优化

4、在多表关联的同时,尽可能多的写全WHERE条件,一般情况下mysql存储引擎在查询时会通过WHERE条件来过滤多余的数据,然后才会进行关联操作,一般情况下正确使用索引以及多写WHERE条件可以解决大部分慢查询问题。

5、该关联需要频繁查询,时效性要求一般(每2至6小时刷新数据一次即可);答:针对这种情况目前我一般使用存储过程的方式生成新的单表结果表(中间表)。可以通过编写对应的存储过程,把多表关联分解为一个个双表关联插入中间表中,再通过中间表一步一步进行关联,最后插入到一张结果表中,设置好事件(EVENTS)或者在linux(操作系统)层面设定定时任务,按照需求每几个小时调度一次该存储过程,刷新最后的结果表。在APP或者PC页面使用的时候只需要一个简单的单表SELECT查询语句即可快速查询结果。

6、该关惠腈没杯联需要频繁查询,时效性要求非常高(实时查询);答:频繁且需要实时查询的情况非常多见,主要要分析慢查询的原因,第一点,既然是需要实时酴兑镗笄查询,在表设计的时候需要留有冗余,不要一味的最求数据库范式级别,能不做关联的尽量不做关联,如果出现多表关联的90%都是表结构设计不合理导致的。需要调整表结构把需要查询的表数据都存储的在同一张表。第二点很有可能是数据量过大导致,这种情况要确认查询数据的范围,及时把不需要的数据存储存入历史表。如果数据量还是过大,则可以尝试分库分表的方式来解决该问题。比如通过主键字段的奇偶分表,根据表内数据的地域分表,根据余数分表都是可以减少数据量的方式。

7、这里篇幅有限,只能简单聊聊mysql多表关联优化的内容,看提问应该是询问第一种的可能性大一点,就多写一些,欢迎留言一起探讨,最好有实际问题的例子,不然只能比较宽泛的解答了,本人水平有限,如有谬误,请不吝指正,谢谢。

© 手抄报圈