引发连表查询出现的原因是什么?在对一个业务进行表结构设计时,肯定要分很多张表,不同的表承载不同的数据,各种数据相互关联,共同支撑业务。表结构设计有很多技巧和原则,比如冗余性设计、数据库范式、反范式等,总之不管如何设计,一张表是无法承载所有业务的,必须分成不同的表。MySQL因为存在多张表,当超出单张表字段的查询需求出现时,就产生了MySQL连表查询。MySQL连表查询简介MySQL的连表查询,分为内连接、外连接查询两种类型,其中外连接查询又分为左外连接和右外连接查询。内连接语法:select * from t1,t2;select * from t1 join t2;select * from t1 inner join t2;select * from t1 cross join t2;其中,前面的t1表为驱动表,后面的t2表为被驱动表。内连接就是数学中的笛卡尔积,假设t1表有3条记录,t2有5条记录,则执行上面的SQL语句之后结果集有3*5=15条记录。select * from t1;select * from t2;select * from t1,t2;外连接语法:右连接:SELECT* FROM tl RIGHT [OUTER] JOIN t2 ON 连接条件 [where 普通过滤条件];左连接:SELECT* FROM tl LEFT [OUTER] JOIN t2 ON 连接条件 [where 普通过滤条件];其中,t1为驱动表,t2为被驱动表,以t1表为驱动表,首先过滤t1表的记录,根据t1表的记录,逐条去t2表查询符合条件的记录,然后组合为一条记录,直至完成全部组装。连接查询的优化方式拆分连表查询为单表查询,通过程序组装结果集,返回给客户端;如果没有实时性、强一致性要求,可以全部缓存到redis,定时更新缓存,直接从缓存取数据;改变驱动表或被驱动表的访问方法:ALL——》index——》range——》ref_or_null——》ref——》const;驱动表和被驱动表的过滤条件最好用主键或者唯一二级索引;增大join buffer size的大小,增大被驱动表的缓存数据,减少驱动表的扫描次数;减少不必要的字段查询,避免引起不必要的回表,减少join buffer的缓存数据量,增大缓存记录数;总结性能优化只能是从战术层面解决问题或者存在的bug,因为随着数据量的增长,包括记录数目、存储大小的不断增长,任何战术层面的性能优化总归是无法处理的。战略层面要考虑分库分表或者采用分布式数据库,比如OceanBase、Tidb等。技术上升到一定的层面就不是单纯的技术问题了,一切学科都是相通的了。
版权免责声明: 本站内容部分来源于网络,请自行鉴定真假。如有侵权,违法,恶意广告,虚假欺骗行为等以上问题联系我们删除。
本文地址:https://www.16757.com/article/1856.html