mysql单表in查询优化_MySQL中另⼀种查询优化⽅案—重构
查询的⽅式
在MySQL中经常会去优化查询,其⽬的是到⼀种更快,效率更⾼的⼀种⽅式去获取查询结果。⼀般情况下是通过优化SQL语句来提⾼效率,例如增加索引,使⽤需要的字段代替”*“号等。还有⼀种优化⽅式--重构查询的⽅式,将⼀个复杂的查询拆成多个查询来提⾼效率。下⾯就具体介绍下:
1、在设计查询是选择⼀个复杂查询还是多个简单查询。
对于在设计查询是选择⼀个复杂查询还是多个简单查询,这个需要从多⽅⾯来考虑。例如:
1)、应⽤程序连接数据库和断开连接的性能消耗,耗费时长。不同数据库的性能消耗和耗费时长是不⼀样的。(在MySQL中连接和断开连接是轻量级的)
2)、在查询效率和数据库性能⽅⾯,在都能实现业务的情况下选择查询效率⾼且不影响数据库性能的⽅式。
3)、考虑实际的业务场景适合哪种查询。
注:设计查询时,在保证效率、性能以及对数据库的影响的前提下,尽量选择⼀条查询语句来实现;
2、切分查询
什么是切分查询,就是将⼀个⼤查询拆分成多个⼩查询,每次完成⼀部分,分多次完成。例如:删除数据库中不需要的数据或对同⼀条件修改⼤量数据时,可能需要⼀次对⼤量数据进⾏加锁且占满整个事务⽇志,造成多个其他的⼩查询阻塞,系统资源消耗,并且会增加MySQL 主从同步的延迟。这个时候就可以分成多个较⼩的查询来完成,尽可能地减⼩多MySQL的影响。具体例⼦看下图:
切分查询的例⼦
3、分解关联查询
什么是分解关联查询,简单来说就是将⼀个关联多表的查询的语句,分解成多个查询单表或者说简单查询的语句,通过这种⽅式来提⾼SQL 语句的效率,降低MySQL的性能消耗。下⾯通过实例具体讲解下:先准备基础数据:
⼈员表user
订单表 order
订单明细表 orderitem
例如上⾯三个表,我们需要查询出性别为男的订单⾥⾯有哪些货号(articleNumber)?,通常会这么去写SQL语句:
select oi.articleNumber from user u inner join order o on u.ater inner join orderitem oi on o.derid where u.sex='男';sql语句优化方式
当数据量过⼤时,这样关联查询可能会⽐较慢,影响数据库性能。这个时候我们就可以将这个关联查询语句进⾏分解。分解成如下的语句:
select username from user where sex='男';select id from order where creater in ('001','003');select articleNumber from orderitem where orderid in(1,3);
这样就可以让⼀个关联查询分解成了多个单表查询的,这样的好处有以下⼏点:
1)、单表查询容易使⽤到缓存,提⾼效率;
2)、单表查询可以减少锁的竞争,不容器造成阻塞在应⽤层做关联;
3)、可以更容易对数据库进⾏拆分,更容易做到⾼性能和可扩展;
4)、单表查询更容易⾛索引,且不⽤回表;
5)、可以减少冗余记录的查询,减少不必要的数据加载到内存当中;
6)、更进⼀步,这样做相当于在应⽤层中实现了哈希关联,⽽不是使⽤MySQL的嵌套循环关联;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论