mysql 用多次查询代替一次复杂join查询的优点分析

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt344

多高性能的应用都会对关联查询进行分解。简单地,可以对每一个表进行一次单表查询,然后将结果在应用程序中进行关联。例如,下面这个查询:

可以分解为下面这些查询来代替:

到底为什么要这样做?乍一看,这样做并没有什么好处,原本一条查询,这里却变成多条查询,返回的结果又是一模一样的。事实上,用分解关联查询的方式重构查询有如下的优势:

?让缓存的效率更高。许多应用程序可以方便地缓存单表查询对应的结果对象。例如,上面查询中的tag已经被缓存了,那么应用就可以跳过第一个查询。再例如,应用中已经缓存了ID为123、567、9098的内容,那么第三个查询的IN()中就可以少几个ID。另外,对MySQL的查询缓存来说注6,如果关联中的某个表发生了变化,那么就无法使用查询缓存了,而拆分后,如果某个表很少改变,那么基于该表的查询就可以重复利用查询缓存结果了。

?将查询分解后,执行单个查询可以减少锁的竞争。

?在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展。

?查询本身效率也可能会有所提升。这个例子中,使用IN()代替关联查询,可以让MySQL按照ID顺序进行查询,这可能比随机的关联要更高效。我们后续将详细介绍这点。

?可以减少冗余记录的查询。在应用层做关联查询,意味着对于某条记录应用只需要查询一次,而在数据库中做关联查询,则可能需要重复地访问一部分数据。从这点看,这样的重构还可能会减少网络和内存的消艳。

?更进一步,这样做相当于在应用中实现了哈希关联,而不是使用MySQL的嵌套循环关联。某些场景哈希关联的效率要高很多。

在很多场景下,通过重构查询将关联放到应用程序中将会更加高效,这样的场景有很多,比如:当应用能够方便地缓存单个查询的结果的时候、当可以将数据分布到不同的MySQL服务器上的时候、当能够使用IN()的方式代替关联查询的时候、当查询中使用同一个数据表的时候。

时间: 2024-08-11 01:34:16

mysql 用多次查询代替一次复杂join查询的优点分析的相关文章

mysql 查询性能优化第一章 为什么查询速度会慢

一 为什么查询速度会慢 在尝试编写快速的查询之前,咱们需要清楚一点,真正重要的是响应时间.如果把查询看成是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要有 优化查询,实际上要优化起子任务,要么消除其中一些子任务,要么减少子任务的执行次数,Mysql在执行查询的时候有哪些子任务,哪些子任务运行的速度很慢?这里还不好给出完 整的列表.一般来说,查询的生命周期大致可以按照顺序爱看:从客户端->服务器->然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中执行

MySQL加速查询速度的独门武器:查询缓存

[导读] 与朋友或同事谈到MySQL查询缓存功能的时候,个人喜欢把查询缓存功能Query Cache比作荔枝, 是非常营养的东西,但是一次性吃太多了,就容易上火而流鼻血,虽然不是特别恰当的比喻,但是有很多相似的地方.另外Query Cache有其特殊的业务场景,MySQL也不像其他数据库产品,缓存查询语句的执行计划等信息,而是直接缓存查询语句的结果集和对应的SQL语句.本文 就给大家介绍下查询缓存的相关知识,希望可以引导大家正确地使用Query Cache独门武器. 对MySQL查询缓存从五个角

MySQL慢日志查询全解析:从参数、配置到分析工具【转】

转自: MySQL慢日志查询全解析:从参数.配置到分析工具 - MySQL - DBAplus社群——围绕数据库.大数据.PaaS云,运维圈最专注围绕“数据”的学习交流和专业社群http://dbaplus.cn/news-11-694-1.html 一.慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中.long_query_time的默认值为

mysql,show processlist,查询一直sending data,影响查询性能

MariaDB [(none)]> show processlist; +--------+--------+------------------+---------+-------------+---------+---------------+----------------------+-------- | Id     | User   | Host             | db      | Command     | Time    | State         | Info

hibernate连接mysql,查询条件中有中文时,查询结果没有记录,而数据库有符合条件的记录(解决方法)

今天在另一台服务器上重新部署了网站,结果出现了以下问题: ——用hibernate做mysql的数据库连接时,当查询条件中有中文的时候,查询结果没有记录,而数据库中是存在符合条件的记录的. 测试了以下,发现不加条件查询可以查到,加上查询条件包含中文就无法找到记录. 百度发现,以下两篇文章很有帮助. http://gzxabcdefg.blog.163.com/blog/static/23451794201081554816892/ http://bbs.51cto.com/thread-1031

php中对MYSQL操作之预处理技术(2)数据库dql查询语句

<?php //预处理技术 //创建一个mysqli对象 $mysqli = new MySQLi("主机名","mysql用户名","密码","数据库名"); //判断是否链接成功 if($mysqli->connect_error){ die($mysqli->connect_error); } //创建预编译对象 $sql = "select id,name,age,qq from 表名 wh

mysql join 查询图

mysql join 查询,特别是对查两个表之间的差集,可以用table字段=null来做. 注意千万不是join on XX!=XX  ,这样出来的结果是错误的.

MySQL慢查询【一】 - 开启慢查询

一.简介 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能. 二.参数说明 slow_query_log 慢查询开启状态slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)long_query_time 查询超过多少秒才记录 三.设置步骤 1.查看慢查询相关参数 mysql> show variables like 'slow_query%

MySQL数据库学习【第八篇】多表查询

一.准备 首先先准备表 员工表和部门表 #建表 create table department( id int, name varchar(20) ); create table employee1( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male', age int, dep_id int ); #插入数据 insert into depa