字段使用子查询速度特别慢

yaotomo 2018-07-18 04:28:45

SELECT
t1.Name_Zh,
t1.LevelName,
t2.FatherID,
t2.NodeID,
t2.SP_ID,
(select CASE count(*) WHEN 0 THEN 'True' ELSE 'False' END
from taxon where FatherID = t2.NodeID ) as EndNode
FROM plantsp t1, taxon t2 ,taxonsystems t3
where t3.ID = t2.S_ID
and t2.SP_ID = t1.ID
and t3.id= '2802'
and t1.LevelName = 'City'


以上的语句,如果不加那个子查询,1,2秒就能出结果。但是加上后要半分钟才能出结果。taxon表有13万条数据。
请问如何优化使得查询速度能快一些?
...全文
1182 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
k10509806 2018-07-27
  • 打赏
  • 举报
回复
总之就是要建索引
hghua 2018-07-26
  • 打赏
  • 举报
回复
SELECT t1.Name_Zh,
t1.LevelName,
t2.FatherID,
t2.NodeID,
t2.SP_ID,
case when t.FatherID is null then 'True' else 'False' end EndNode
FROM plantsp t1,
taxon t2
left join taxon t on t.FatherID = t2.NodeID,
taxonsystems t3
WHERE t3.ID = t2.S_ID
AND t2.SP_ID = t1.ID
AND t3.id = '2802'
AND t1.LevelName = 'City'
group by t2.NodeID

group by不需要加select的所有字段
zjcxc 2018-07-23
  • 打赏
  • 举报
回复
另外,最好建个 FatherID 上的独立索引
zjcxc 2018-07-23
  • 打赏
  • 举报
回复
case when exists(select* from taxon where FatherID = t2.NodeID THEN 'True' ELSE 'False' END as EndNode
wantfly808 2018-07-22
  • 打赏
  • 举报
回复
子查询不要用统计,统计要全部数据计算,肯定慢,判断只要存在数据就为true,否则是false,这样应该会快,如果语句里不好实现,可以加多个FUNCTOIN,语句里调用FUNCTOIN
yaotomo 2018-07-18
  • 打赏
  • 举报
回复
引用 1 楼 iamboy_11 的回复:
请提供你的表结构谢谢!



CREATE TABLE `taxon` (
`NodeID` varchar(36) NOT NULL COMMENT '节点数据的唯一ID',
`S_ID` char(36) NOT NULL COMMENT '分类树ID',
`SP_ID` varchar(36) NOT NULL COMMENT '物种表ID(plantsp表ID,物种名称、地名都保存于此)。如S_ID非空,可以到plantsp表查询更多信息。',
`S_SN` varchar(20) NOT NULL DEFAULT '' COMMENT '各分类树内的节点代码',
`LevelID` char(36) NOT NULL COMMENT '节点名称等级',
`IsEndNode` enum('Yes','No') NOT NULL DEFAULT 'No' COMMENT '是否是分类树末节点',
`SubSystemCount` int(11) NOT NULL DEFAULT '0' COMMENT '以此节点为根节点的分类树数量',
`FatherID` varchar(36) NOT NULL DEFAULT '' COMMENT '父节点',
`PrevID` varchar(36) NOT NULL DEFAULT '' COMMENT '前一节点',
`LocationSN` int(11) NOT NULL DEFAULT '0' COMMENT '',
`Description` varchar(10000) NOT NULL DEFAULT '' COMMENT '节点描述',
`NameStatus` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '节点名称状态',
`Agrees` int(4) NOT NULL DEFAULT '0' COMMENT '',
`DisAgrees` int(4) NOT NULL DEFAULT '0' COMMENT '',
`Editor` varchar(20) NOT NULL COMMENT '',
`EditTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '',
`EditMemo` varchar(200) NOT NULL DEFAULT '' COMMENT '',
`NodeNameZh` varchar(100) DEFAULT NULL COMMENT '节点中文名',
`NodeNameEn` varchar(100) DEFAULT NULL COMMENT '节点英文名',
`NodePhotos` text COMMENT '节点照片页',
`NodeSpecimens` text COMMENT '节点标本页',
`NodeWikiPage` varchar(100) DEFAULT NULL COMMENT '节点百科信息页面',
`NodeRelatingNames` text,
`NodeRefs` text COMMENT '节点参考文献',
PRIMARY KEY (`NodeID`),
UNIQUE KEY `TreeLocation` (`S_ID`,`FatherID`,`PrevID`),
KEY `SpID` (`S_ID`,`SP_ID`),
KEY `SP` (`SP_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


yaotomo 2018-07-18
  • 打赏
  • 举报
回复
这是执行计划,我不怎么会看,还请各位指点

luyaran 2018-07-18
  • 打赏
  • 举报
回复
这个,建议使用存储过程
iamboy_11 2018-07-18
  • 打赏
  • 举报
回复
请提供你的表结构谢谢!

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧