当前位置:  数据库>mysql

MySQL查询优化:用子查询代替非主键连接查询实例介绍

    来源: 互联网  发布时间:2014-10-08

    本文导语:  一对多的两张表,一般是一张表的外键关联到另一个表的主键。但也有不一般的情况,也就是两个表并非通过其中一个表的主键关联。 例如: 代码如下: create table t_team ( tid int primary key, tname varchar(100) ); create table t_people ( pid i...

一对多的两张表,一般是一张表的外键关联到另一个表的主键。但也有不一般的情况,也就是两个表并非通过其中一个表的主键关联。
例如:
代码如下:

create table t_team
(
tid int primary key,
tname varchar(100)
);
create table t_people
(
pid int primary key,
pname varchar(100),
team_name varchar(100)
);

team表和people表是一对多的关系,team的tname是唯一的,people的pname也是唯一的,people表中外键team_name和team表的tname关联,并不是和主键id关联。
(PS:先不说这样的设计合不合理,但如果真的摊上这事儿…..很多表的设计是每个表有一个id和uuid,id作为主键,uuid作关联,和上面情况类似)
现在要查询pname是"xxg"的people和team信息:
SELECT * FROM t_team t,t_people p WHERE t.tname=p.team_name AND p.pname='xxg' LIMIT 1;

SELECT * FROM t_team t INNER JOIN t_people p ON t.tname=p.team_name WHERE p.pname='xxg' LIMIT 1;
执行一下,可以查询出结果,但是如果数据量大的情况下,效率很低,执行很慢。
对于这种连接查询,用子查询来代替,查询结果相同,但会效率更高:
SELECT * FROM (SELECT * FROM t_people WHERE pname='xxg' LIMIT 1) p, t_team t WHERE t.tname=p.team_name LIMIT 1;
子查询中过滤了大量的数据(仅保留一条),再将结果来连接查询,效率会大大提高。
(PS:另外,使用LIMIT 1也可以提高查询效率,详细:http://blog.csdn.net/xiao__gui/article/details/8726272 )
本人通过3条SQL测试两种查询方式的效率:
准备1万条team数据,准备100万条people数据。
造数据的存储过程:
代码如下:

BEGIN
DECLARE i INT;
START TRANSACTION;
SET i=0;
WHILE i

    
 
 

您可能感兴趣的文章:

  • Mysql查询错误:ERROR:no query specified原因
  • mysql查询语句通过limit来限制查询的行数
  • Mysql设置查询条件(where)查询字段为NULL
  • mysql 开启慢查询 如何打开mysql的慢查询日志记录
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • mysql 设置查询缓存
  • Mysql Select查询执行流程介绍及实例
  • MySQL 慢查询监控器 Anemometer
  • mysql的SQL_NO_CACHE(在查询时不使用缓存)和sql_cache用法
  • MySQL并行查询引擎 Shard-Query
  • Mysql大表查询优化技巧总结及案例分析
  • 清空mysql 查询缓存的可行方法
  • 在C中如何判断从mysql中查询到的NULL值?
  • php mysql查询指定范围内日期
  • mysql取当前时间与当前日期查询代码
  • MySQL运行状况查询方式介绍
  • 把mysql查询结果保存到文件的shell脚本
  • mysql 查询表中平均分最低的班级
  • mysql 跨表查询、更新、删除示例
  • mysql仿oracle的decode效果查询
  • php查询时间段 mysql时间查询
  • mysql 存储过程实例和基本语法
  • php读取mysql数据库入门实例
  • php读取mysql入门实例
  • 在Mysql上创建数据表实例代码
  • MySQL 有输入输出参数的存储过程实例
  • Linux下安装Mysql多实例作为数据备份服务器实现多主到一从多实例的备份
  • mysql存储过程实例
  • PHP处理SQL脚本文件导入到MySQL的代码实例
  • Sphinx/MySQL 协议支持与SphinxQL应用实例
  • mysql alter语句用法实例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • mysql中如何查看最大连接数(max_connections)和修改最大连接数
  • 在 linux下输入"mysql"命令,进入mysql命令行,但出现“Can't connetc to local MySQL server thuough socket /var/lib/mysql/mysql.sock
  • php安装完成后如何添加mysql扩展
  • MySQL 重装MySQL后, mysql服务无法启动
  • Myeclipse中自带Tomcat的JDBC连接池配置(mysql和mssql)
  • 为什么用linux安装盘安装了mysql后,启动mysql,提示找不到mysql.sock文件?
  • MySQL Workbench的下载安装与使用教程
  • 請教,在redhat linux7.2+mysql 中,系統提示mysql已啟動,網頁卻不能訪問mysql?
  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • 求解释: useradd -g mysql mysql -d /home/mysql -s /sbin/nologin
  • VS2012+MySQL+SilverLight5的MVVM开发模式介绍
  • 在Linux内安装了Mysql,无法进入Mysql.
  • MySQL索引基本知识
  • 怎样在linux终端输入mysql直接进入mysql?
  • mysql中字符串和时间互相转换的方法(自动转换及DATE_FORMAT函数)
  • c++中关于#include <mysql/mysql.h>的问题?
  • java将类序列化并存储到mysql(使用hibernate)
  • mysql -u root mysql 怎么解释
  • Mysql索引类型:B-Tree索引介绍
  • mm.mysql那里可以下载?www.mysql.com根本下载不了。谢谢了
  • Win7 64位下mysql 下载、安装与配置图文教程
  • MySQL集群 MySQL Cluster




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3