OC

Knowledge OS
登录 注册
全部话题 移民 创业 iOS Mac Objective-C Swift Android 招聘 求职

一句Sql语句的优化(带子查询)

tinyfool
tinyfool 发布于 2013年11月20日
无人欣赏。
SELECT * FROM `threads` where `createbyid` <> 24016 AND `id` in (SELECT `threadid` FROM `thread_replys` WHERE `userid` = 24016 GROUP BY `threadid`); 

这么一句sql,要想高效,应该怎么写?

共24条回复
楼长 ·
coredump 回复于 2013年11月20日

试试用join: SELECT t.* FROM threads t inner join thread_replys r ON t.id = r.threadid where t.createbyid <> 24016 AND r.userid = 24016;

2楼 ·
tinyfool 回复于 2013年11月20日

1楼 @coredump 快一些不过还是需要10s多。。

3楼 ·
fanngyuan 回复于 2013年11月20日

2楼 @tinyfool 你的表结构贴出来看看,show create table threads

4楼 ·
terryso 回复于 2013年11月20日

2楼 @tinyfool 我觉得首先要看看执行计划,找出查询慢的瓶颈。 另外检查看看有没有针对相关字段做索引。。。

5楼 ·
贵人 回复于 2013年11月20日

用exist替换in试试

6楼 ·
tinyfool 回复于 2013年11月20日

3楼 @fanngyuan

CREATE TABLE `threads` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `title` varchar(255) NOT NULL DEFAULT '',
 `content` blob NOT NULL,
 `createby` varchar(50) NOT NULL DEFAULT '',
 `createbyid` int(11) NOT NULL,
 `lastreply` varchar(50) NOT NULL DEFAULT '',
 `lastreplyid` int(11) NOT NULL DEFAULT '0',
 `createdate` int(11) NOT NULL,
 `updatedate` int(11) NOT NULL,
 `replys` int(11) NOT NULL,
 `modifydate` int(11) NOT NULL DEFAULT '0',
 PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1540 DEFAULT CHARSET=utf8;
7楼 ·
coredump 回复于 2013年11月20日

2楼 @tinyfool 看看你的SQL运行的执行计划,index是不是使用正常(特别是那个createdbyid有没有索引?)。 一般来说用IN都会较慢,因为内部查询不结束外部查询无法开始。

8楼 ·
贵人 回复于 2013年11月20日

4楼 @terryso 对,支持楼上,最好先看看执行计划,如果有必要,可以在id上加索引,并且将索引的查询条件放在where条件的最前面

9楼 ·
coredump 回复于 2013年11月20日

如果记录数很大MyISAM engine也应该考虑换成其它的

10楼 ·
tinyfool 回复于 2013年11月20日

createbyid也加上索引了,没有发现明显变化

本帖有24个回复,因为您没有注册或者登录本站,所以只能看到本帖的10条回复。如果想看到全部回复,请注册或者登录本站。
登录 或者 注册
[顶 楼]
|
|
[底 楼]
|
|
[首 页]

AltStyle によって変換されたページ (->オリジナル) /