我有以下复杂的查询,我需要使用它。当我运行它时,需要30到40秒。但是,如果我一条一条地删除订单,需要0.0317秒,返回的结果,这是真快,比较30秒或40当查询按子句排序时运行速度非常慢的复杂sql
select DISTINCT media.*
, username
from album as album
, album_permission as permission
, user as user, media as media
where ((media.album_id = album.album_id
and album.private = 'yes'
and album.album_id = permission.album_id
and (permission.email = '' or permission.user_id = ''))
or (media.album_id = album.album_id
and album.private = 'no')
or media.album_id = '0')
and media.user_id = user.user_id
and media.media_type = 'video'
order by media.id DESC
LIMIT 0,20
上order by
的ID是太索引的主键。所以我不知道是什么问题。
我也有相册和相册权限表,只是为了检查媒体是公共还是私人,如果是私人的,那么检查用户是否有权限。我想也许这是造成这个问题。如果我在子查询中这样做了,会更好吗?如果这是解决方案,也可以有人帮我写这个子查询吗?如果你不能写出来,至少告诉我。我真的要疯了这个问题..
SOLUTION MAYBE
是的,我觉得子查询将是这个最佳的解决方案,因为下面的查询在0.0022秒运行。但我不确定专辑的验证是否准确,请检查。
select media.*, username
from media as media
, user as user
where media.user_id = user.user_id
and media.media_type = 'video'
and media.id in
(select media2.id
from media as media2
, album as album
, album_permission as permission
where ((media2.album_id = album.album_id
and album.private = 'yes'
and album.album_id = permission.album_id
and (permission.email = ''
or permission.user_id = ''))
or (media.album_id = album.album_id
and album.private = 'no')
or media.album_id = '0')
and media.album_id = media2.album_id)
order by media.id DESC
LIMIT 0,20
非常好Q.我很感兴趣,如果有人能想到这件事...... – TheCodeArtist 2010-04-22 06:44:43
“请检查” - 你需要自己检查一下。测试两个查询。他们返回相同的结果吗? – APC 2010-04-22 06:54:08
我无法检查对查询的验证,他们都返回相同的结果,但我也需要检查私人相册,哪些数据不是可用的..但无论如何,我会稍后添加它们,并检查..但是什么和为什么要这样做?我的意思是子查询确实比第一个查询更快。我测试了它们两个,结果是一样的。 – Basit 2010-04-22 07:37:22