- 浏览: 93174 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
xiaoyi829:
应该可以grzrt 写道分区表partition,能用hand ...
初识mysql插件之HandlerSocket -
grzrt:
分区表partition,能用handlersocket查询指 ...
初识mysql插件之HandlerSocket
MySQL左连接查询是连接查询中的一种方式,下面就为您介绍MySQL左连接查询中的一些问题谈论,如果您感兴趣的话,不妨一看。
我这里所说的主表是指在连接查询里MySQL以哪个表为主进行查询。比如说在MySQL左连接查询里,一般来说左表就是主表,但这只是经验之谈,很多时候经验主义是靠不住的,为了说明问题,先来个例子,建两个演示用的表categories和posts:
CREATE TABLE IF NOT EXISTS `categories` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(15) NOT NULL, `created` datetime NOT NULL, PRIMARY KEY (`id`), KEY `name` (`name`) ); CREATE TABLE IF NOT EXISTS `posts` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `category_id` int(10) unsigned NOT NULL, `title` varchar(100) NOT NULL, `content` varchar(200) NOT NULL, `created` datetime NOT NULL, PRIMARY KEY (`id`), KEY `category_id` (`category_id`), KEY `created` (`created`), KEY `category_id_created` (`category_id`, `created`) );
先注意一下每个表的索引情况,以后会用到,记得随便插入一点测试数据,不用太多,但怎么也得两行以上,然后执行以下
SQL: EXPLAIN SELECT * FROM posts LEFT JOIN categories ON posts.category_id = categories.id WHERE categories.name LIKE 'foobar%' ORDER BY posts.created DESC
结果如下所示:
table key Extra categories name Using where; Using temporary; Using filesort posts category_id
在join查询的explain的结果中,第一行表示的表就是主表。所以说在此查询里categories是主表,而在我们的经验里,LEFT JOIN查询里,左表(posts表)才应该是主表,这产生一个根本的矛盾,MySQL之所以这样处理,是因为在我们的WHERE部分,查询条件是按照 categories表的字段来进行筛选的,且categories表刚好存在合适的索引,所以在查询时把categories表作为主表更有利于缩小结果集。
那explain结果中的Using temporary; Using filesort又是为什么呢,为什么created或category_id_created索引无效呢?这是因为主表是categories表,从表是posts表,而我们使用从表的字段去ORDER BY,这通常不是一个好选择,最好改成主表字段。不过很多时候改不了,那就没招了。
再看一个比较怪异的例子:
EXPLAIN SELECT * FROM posts LEFT JOIN categories ON posts.category_id = categories.id WHERE categories.id = ‘一个已经存在的ID’ ORDER BY posts.created DESC
这个例子里posts表仍然是从表,但是按照从表排序的结果却没有出现文件排序和临时表,这是因为已经确定了categories.id,所以主表相当于一个只有一行数据的常量表了,从表根据category_id_created索引在连接的同时自然就得到排序后的结果。但换个角度看,既然 categories.id都是确定的了,那类似这样的需求,我们一般就不会再使用LEFT JOIN查询了,而会分成两个独立的查询去检索categories和posts才对。
主观上一旦搞错了主表,可能怎么调整索引都得不到高效的SQL,所以在写SQL时,比如说在写MySQL左连接查询时,如果希望左表是主表,那么就要保证在WHERE语句里的查询条件尽可能多的使用左表字段,进而,一旦确定了主表,也最好只通过主表字段去ORDER BY。
注意:大多数情况下,使用从表字段去排序都是低效的,我最初的例子误导了大家,已更正。
我这里所说的主表是指在连接查询里MySQL以哪个表为主进行查询。比如说在MySQL左连接查询里,一般来说左表就是主表,但这只是经验之谈,很多时候经验主义是靠不住的,为了说明问题,先来个例子,建两个演示用的表categories和posts:
CREATE TABLE IF NOT EXISTS `categories` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(15) NOT NULL, `created` datetime NOT NULL, PRIMARY KEY (`id`), KEY `name` (`name`) ); CREATE TABLE IF NOT EXISTS `posts` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `category_id` int(10) unsigned NOT NULL, `title` varchar(100) NOT NULL, `content` varchar(200) NOT NULL, `created` datetime NOT NULL, PRIMARY KEY (`id`), KEY `category_id` (`category_id`), KEY `created` (`created`), KEY `category_id_created` (`category_id`, `created`) );
先注意一下每个表的索引情况,以后会用到,记得随便插入一点测试数据,不用太多,但怎么也得两行以上,然后执行以下
SQL: EXPLAIN SELECT * FROM posts LEFT JOIN categories ON posts.category_id = categories.id WHERE categories.name LIKE 'foobar%' ORDER BY posts.created DESC
结果如下所示:
table key Extra categories name Using where; Using temporary; Using filesort posts category_id
在join查询的explain的结果中,第一行表示的表就是主表。所以说在此查询里categories是主表,而在我们的经验里,LEFT JOIN查询里,左表(posts表)才应该是主表,这产生一个根本的矛盾,MySQL之所以这样处理,是因为在我们的WHERE部分,查询条件是按照 categories表的字段来进行筛选的,且categories表刚好存在合适的索引,所以在查询时把categories表作为主表更有利于缩小结果集。
那explain结果中的Using temporary; Using filesort又是为什么呢,为什么created或category_id_created索引无效呢?这是因为主表是categories表,从表是posts表,而我们使用从表的字段去ORDER BY,这通常不是一个好选择,最好改成主表字段。不过很多时候改不了,那就没招了。
再看一个比较怪异的例子:
EXPLAIN SELECT * FROM posts LEFT JOIN categories ON posts.category_id = categories.id WHERE categories.id = ‘一个已经存在的ID’ ORDER BY posts.created DESC
这个例子里posts表仍然是从表,但是按照从表排序的结果却没有出现文件排序和临时表,这是因为已经确定了categories.id,所以主表相当于一个只有一行数据的常量表了,从表根据category_id_created索引在连接的同时自然就得到排序后的结果。但换个角度看,既然 categories.id都是确定的了,那类似这样的需求,我们一般就不会再使用LEFT JOIN查询了,而会分成两个独立的查询去检索categories和posts才对。
主观上一旦搞错了主表,可能怎么调整索引都得不到高效的SQL,所以在写SQL时,比如说在写MySQL左连接查询时,如果希望左表是主表,那么就要保证在WHERE语句里的查询条件尽可能多的使用左表字段,进而,一旦确定了主表,也最好只通过主表字段去ORDER BY。
注意:大多数情况下,使用从表字段去排序都是低效的,我最初的例子误导了大家,已更正。
发表评论
-
mysql dump 备份及脚本!
2011-06-10 13:38 1553导出多张表的时候表之间用空格分开: # mysqldump ... -
mysql备份脚本
2011-06-03 17:32 684!/bin/sh # mysql_backup.sh: bac ... -
CentOS挂载移动硬盘
2011-06-03 15:12 10971, 首先确认fuse,CentOS 5.5 带有fuse,可 ... -
MySQL 左连接 右连接
2011-06-03 14:03 871表A记录如下: aID aNum 1 ... -
[转]CentOS5 下安装与配置飞鸽传书(Ipmsg)完美完结篇
2011-05-27 10:29 1560CentOS5 下安装与配置飞鸽传书(Ipmsg)完美完结篇 ... -
深入SQL语句性能调整
2011-05-17 13:20 863本文sqlserver为例 有 ... -
windows和linux下开启mysql日志
2011-05-11 10:24 2322mysql有以下几种日志: 错误日志: -log-err 查询 ... -
MYSQL数据库设计的一点总结
2011-04-13 14:48 704选表类型: 大家都知道 ... -
mysql 清理碎片
2011-04-13 09:59 918显示你数据库中存在碎片的全部列表: select tab ... -
MySQL 建表语法
2011-04-12 14:21 8021、最简单的: CREATE TABLE t1( id ... -
排序时最快的取出尽量少的字段且索引字段
2011-04-11 15:51 835select company_albums.id,compan ... -
MySQL性能优化
2011-04-02 10:53 732作者:andyao 原文link: http://andyao ... -
Mysql Innodb 引擎优化-参数
2011-03-30 16:49 770介绍: InnoDB给MySQL提供了具有提交,回滚和崩溃 ... -
MySQL前端和后台的系统优化
2011-03-30 16:39 799本文中介绍的系统优化 ... -
MySQL配置文件my.cnf 做笔记用
2011-03-30 16:33 804MySQL配置文件my.cnf 例子最详细翻译,可以保存做笔记 ... -
测试脚本mysql_插入100万行数据
2011-03-29 16:31 1360CREATE DEFINER=`root`@`localhos ... -
Mysql日期和时间函数
2011-03-29 15:50 675这里是一个使用日期函 ... -
MySQL数据库优化的具体方法说明
2011-03-29 15:39 761以下的文章主要讲述的是实现MySQL数据库简单实用优化的具体方 ... -
MySQL之Explain
2011-03-29 15:16 622前记:很多东西看似简 ... -
MySQL维护命令集锦--查看表的状态(show table status)
2011-03-29 15:11 1231查看表的引擎类型等状态信息: show table statu ...
相关推荐
主要介绍了MYSQL 左连接右连接和内连接的详解及区别的相关资料,需要的朋友可以参考下
实验报告主要涵盖了数据库系统的基本操作,特别是MySQL中的分组查询、多表连接和子查询的运用。以下是对这些知识点的详细解释: 1. **GROUP BY 语句与聚合函数**: GROUP BY 语句用于将数据分组,通常与聚合函数如...
如果我们想要获取 table1 中的所有记录,并将其与 table2 中的记录连接起来,可以使用左连接查询。 结果将是: | table1.name | table1.city | table2.name | table2.city | | --- | --- | --- | --- | | Person A...
在数据库查询中,连接操作是将两个或多个表的数据...反之,如果希望包含所有右表的记录,即使左表中没有匹配,就使用右外连接。了解这些基本的连接类型及其差异,对于优化 SQL 查询和处理复杂的数据库关系至关重要。
根据文件中提供的信息,我们可以详细探讨MySQL中的不同连接类型,包括左连接(LEFT JOIN)、右连接(RIGHT JOIN)、内连接(INNER JOIN)以及等值连接的概念和它们之间的异同。 首先,我们需要明确什么是“连接”...
下面,我们将通过图文教程的方式来详细解释如何使用 DBeaver 连接 MySQL 数据库。 首先,你需要启动 DBeaver 应用程序。一旦应用程序打开,你会看到一个主界面,通常包含多个工作区和选项卡。为了建立一个新的...
什么是查询? 怎么查的? 数据的准备如下: [sql] view plain copy create table STUDENT( STU_ID int primary KEY, STU_NAME char(10) not null, STU_AGE smallint unsigned not null, STU_SEX char(2) not ...
MySQL 提供了多种连接类型,包括 INNER JOIN(内连接)、LEFT JOIN(左连接)和 RIGHT JOIN(右连接)。这些连接方式主要根据不同的数据需求,确定如何处理两表之间的匹配关系。 1. INNER JOIN(内连接) INNER ...
例如,在查询员工信息和对应的部门信息时,可以使用左连接;在查询部门信息和对应的员工信息时,可以使用右连接。 四、 实践案例 创建两个表 department 和 job,department 表包含部门 ID、代码和名称,job 表...
执行左连接查询: ```sql SELECT * FROM emp e LEFT JOIN dept d ON e.deptno = d.deptno; ``` #### 五、总结 本文详细介绍了MySQL中的多条件查询技术,特别是子查询和多表查询的相关知识点。子查询提供了一种灵活...
### MySQL多表查询和EXISTS查询性能对比 #### 测试环境 在进行MySQL多表查询与EXISTS查询的性能对比之前,首先需要了解测试环境的相关配置。虽然原文中并未给出具体的测试环境细节,但在实际操作中,这一步骤至关...
MySQL中的连接查询是数据库操作中的核心技能之一,它允许用户将多个表的数据组合在一起,以获取更复杂的数据分析结果。本文将深入探讨七种主要的MySQL连接查询类型,并提供每种查询的实现示例。 1. 内连接(INNER ...
常见的连接类型包括内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN)。 2. 子查询(Subquery):子查询是在一个查询语句中嵌套另一个查询,用于获取临时结果,然后这个结果...
本文将详细介绍MySQL中涉及的几种基本的多表连接查询方法,包括笛卡尔积、内连接和外连接,以及它们的使用场景和技巧。 1. 笛卡尔积(交叉连接): 笛卡尔积是通过CROSS JOIN或简单的JOIN实现的,也可以用逗号(,)...
打开数据库连接,正常显示中文标签,正常显示负号,使用 execute() 方法执行 SQL 查询
MYSQL 查询操作也可以使用连接,例如: ```sql SELECT * FROM 学生表 LEFT JOIN 监护人表 ON 学生表.学号=监护人表.学号 ``` 这将在“学生表”和“监护人表”中选择满足条件的记录,并返回左边表“学生表”中的所有...
### 使用 SQLyog 连接 MySQL 的步骤 1. **安装 SQLyog**:下载并运行 `SQLyog-12.5.0-0_setup.exe` 安装程序,按照提示完成安装过程。 2. **配置连接参数**:启动 SQLyog,点击“连接”按钮,输入 MySQL 服务器的...
MySQL数据库中的外连接是数据查询中的一个重要概念,它允许我们在联接两个或多个表时,不仅包含匹配的行,还包含至少一个表的所有行。这与内连接不同,内连接只返回两个表中存在匹配的行。外连接分为两种主要类型:...