2 first773 first773 于 2017.08.28 16:33 提问

mysql语句优化,in语句多表查询优化

比如我要查一张菜单表,想查询名字为‘product’和子菜单名字为‘product’的菜单,下面是我写的语句。
请问这种怎么用join才代替in,或者有没有别的办法让效率变得高点

select * FROM menu As m where m.name = 'product' or m.menuid in (SELECT parentid FROM menu where name='product')

语句只是做个比喻,因为业务比较复杂,所以随便写个例子

7个回答

z342401436
z342401436   2017.08.28 17:08
已采纳

首先我根据你的SQL理解一下你的业务逻辑
select *
from menu m
where m.name = 'product'
or m.menuid in (select parentid from menu where name = 'product');

用or就是2个数据都想要
第一种是:menu表中 name = 'product' 的数据
第二种是:menu表中 menuid in (select parentid from menu where name = 'product')的数据,in中的表和in外的表是同一个表

拆分成2个SQL,就是这样
select m.*
from menu m
where m.name = 'product';

select t1.*
from menu t1
left join menu t2
on t1.menuid = t2.parentid
where t2.name = 'product';

大概理解你的SQL是想查这两种数据,合并在一个结果集里边……

first773
first773 没错,这样效率会比较快吗
11 个月之前 回复
weixin_38221608
weixin_38221608   2017.08.28 16:44

你要说优化的的话, 就不要用星号(*),用字段代替

select * from menu A
left join menu B 
on A.product= B.product;

first773
first773 *号只是比喻而已,我在实际操作没用*号,你这样写不是我想要的结果啊
11 个月之前 回复
weixin_38680031
weixin_38680031   2017.08.28 16:49

我下面这个sql是只有有主菜单的基础上才会有子菜单的名字哈
select * from parent up left join Child upi
on up.id = upi.parent_id
where up.name ='product'

huang931027
huang931027   Rxr 2017.08.28 16:53

我记得oracle里有一个优化,就是把已知的条件都放在where的最后面。例如
select * FROM menu As m where m.menuid in (SELECT parentid FROM menu where name='product') or m.name = 'product'
这样可以做到提高效率,但是我不知道MySQL是不是也可以这样优化,你参考一下。

li_ling_ren
li_ling_ren   2017.08.28 17:07

用左外连接,然后去重操作,实测望采纳


select distinct m.*
  FROM menu m
  left join menu pm
    on m.menuid = pm.parentid
 where m.name = 'product'

weixin_37697279
weixin_37697279   2017.08.28 18:12

不建议用子查询,子查询索引失效,肯定会慢,用自连接吧

csdn_duanjiao2016
csdn_duanjiao2016   2017.08.28 18:15

要查一张菜单表,想查询名字为‘product’和子菜单名字为‘product’的菜单
从你的业务上面可以发现你又两个控制条件:
1.当前的查找的本身的name是要等于‘product’
2.或者查找到所有的子菜单的name为‘product’的记录
所有我们可以这么写,因为当前的逻辑是或者,因此我们是要使用的是or,而or这种条件似乎是不能使用join这种语句的吧!!!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
多表查询SQL优化
多表连接LEFT JOIN  是一个例子:三张表,也就是多表联查,使用聚集函数SUM,用到了GROUP BY select C.channel_short_name,u.standby2,u.user_name,bs.enroll_batch,bs.pay_school_year,bs.settlement_amount,bs.received_amount, (bs.settlement_
多表查询SQL 语句优化
    数据多个表关联查询时,由于表之间的连接关系(内连接、外连接、交叉连接),导致数据库服务器常常从几万条甚至更多的数据记录中查找符合条件的记录,如果sql查询语句设计不好查询的复杂度就会直线上升,甚至是指数级上升,导致查询时间长甚至失去相应,这里讲两种从sql语句优化查询的方法。1.把外连接变成交叉连接或内连接(对不起,在写改良例子的时候发现这种方法并不能改善查询的速度,这是一个错误):
mysql多表查询优化SQL
今天偶尔在优化一个查询功能的时候心血来潮想写点东西跟大家分享下经验!!! MySQL优化查询(一对多): 1、使用left join(right join),在很多数据的时候尽量避免直接使用where语句 .... and .... and ...这类写法,假设三张表每张表有一千条数据,本意想查出 2、需要哪些列就查哪些列,不要有很多冗余的列查询出来,有的时候一张表当
MySQL多表查询核心优化
在一般的项目开发中,对数据表的多表查询是必不可少的。而对于存在大量数据量的情况时(例如百万级数据量),我们就需要从数据库的各个方面来进行优化,本文就先从多表查询开始。
MySQL优化系列(二)--查找优化(2)(外连接、多表联合查询以及查询注意点)
继续这一系列,上篇的简单查询优化并没讲完,第二点还有查询注意点以及多表查询优化呢!! 文章结构:(1)多表查询步步优化;(2)查询编写的注意点。 主要是内连接,外连接,交叉连接的详解(配图)。以及罗列出,在项目中,一些写sql的注意点。
左连接查询优化
左连接:以左表为基础,显示左表中的所有列,不管是否与关联条件相匹配,而右表中的数据只显示与关联条件相匹配的列,不匹配的列以NULL字符填充.
MYSQL一次千万级连表查询优化(一)
概述:交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的功能,这算是离职人员挖下的坑,随着数据越来越多,原本的SQL查询变得越来越慢,用户体验特别差,因此SQL优化任务交到了我手上。 这个SQL查询关联两个数据表,一个是攻击IP用户表主要是记录IP的信息,如第一次攻击时间,地址,IP等等,一个是IP攻击次数表主要是记录每天IP攻击次数。而需求是获取某天攻击IP信息和次数。(以下SQL
mysql or语句的优化
在某些情况下,or条件可以避免全表扫描的。1 .where 语句里面如果带有or条件, myisam表能用到索引, innodb不行。 1)myisam表: CREATE TABLE IF NOT EXISTS a ( id int(1) NOT NULL AUTO_INCREMENT, uid int(11) NOT NULL, aNum char(20) DEFAULT
mysql or查询优化
上午朋友问我一条sql优化方案,因采用or全表扫描查询,导致查询速度过慢(2s多),问我有没有优化方案,具体sql如下: set @search = 'yd12015'; SELECT `pwd_flag`,`username`,`uid`,`email`,`user_status` FROM `member` WHERE ( `user_status` >=0 and `email_st
mysql中like模糊查询优化
这是我在一个百万级数据库遇到的问题 比如这个语句在这个数据库查询很慢:            select a from news where b like ‘%haha%’ order by time limit 100;    第一种优化方法(注意:这种方法只适用于haha开头的):    //将haha字段和time字段加索引(联合索引还是普通索引自己看情况)