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

Mysql学习MySQL查询优化:用子查询代替非主键连接查询实例介绍,第1张

概述介绍《Mysql学习MySQL查询优化:用子查询代替非主键连接查询实例介绍》开发教程,希望对您有用。

《MysqL学习MySQL查询优化:用子查询代替非主键连接查询实例介绍》要点:
本文介绍了MysqL学习MySQL查询优化:用子查询代替非主键连接查询实例介绍,希望对您有用。如果有疑问,可以联系我们。

一对多的两张表,一般是一张表的外键关联到另一个表的主键.但也有不一般的情况,也就是两个表并非通过其中一个表的主键关联.
例如:
代码如下:
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<10000 DO
INSERT INTO t_team VALUES(i+1,CONCAT('team',i+1));
SET i=i+1;
END WHILE;
SET i=0;
WHILE i<1000000 DO
INSERT INTO t_people VALUES(i+1,CONCAT('people',i+1),i%10000+1));
SET i=i+1;
END WHILE;
COMMIT;
END

SQL语句执行效率:
连接查询
代码如下:
SELECT * FROM t_team t,t_people p WHERE t.tname=p.team_nameAND p.pname='people20000' liMIT 1;

Time:12.594 s
连接查询
代码如下:
SELECT * FROM t_team t INNER JOIN t_peoplep ON t.tname=p.team_name WHERE p.pname='people20000' liMIT 1;

Time:12.360 s
子查询
代码如下:
SELECT * FROM (SELECT * FROM t_people WHEREpname='people20000' liMIT 1) p,t_team t WHERE t.tname=p.team_name liMIT 1;

Time:0.016 s 总结

以上是内存溢出为你收集整理的Mysql学习MySQL查询优化:用子查询代替非主键连接查询实例介绍全部内容,希望文章能够帮你解决Mysql学习MySQL查询优化:用子查询代替非主键连接查询实例介绍所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/1163548.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-01
下一篇2022-06-01

发表评论

登录后才能评论

评论列表(0条)

    保存