2014-11-05 81 views
0

讓我們想象一下,我有以下表結構SQL查詢的提高表現在多個列中選擇不同表的IDS

表:圖像

id path 

1 x 
2 x 
3 x 
4 x 
5 x 
6 x 
7 x 
8 x 

表:用戶

id image imageSmall 

1  1  1 
2  2  2 
3  4  4 

桌:圖書

id image imageSmall 

1  5  5 
2  6  6 
3  8  8 

我現在想要獲取其他表格中使用的每張圖片的ID。我做了這裏

SELECT id FROM images WHERE id IN (SELECT image FROM user) OR id IN (SELECT imageSmall FROM user) OR id IN (SELECT image FROM books) OR id IN (SELECT imageSmall FROM books); 

我看到這裏的問題這個查詢的是,當我有大量的數據,該查詢可能會非常耗時,而不是高性能的,因爲許多IN部分的在所有查詢。有沒有辦法來改善這個查詢的性能?

+0

這是怎麼回事?我不測試,突然試試看:'SELECT DISTINCT id FROM圖像where id in(SELECT image FROM user UNION SELECT imageSmall FROM user UNION SELECT image FROM FROM UNION SELECT imageSmall FROM books);' – vaso123 2014-11-05 11:56:04

+0

每個子選擇都可以被重寫成JOIN 。但是,MySQL優化器足夠聰明,可以做它必須做的事情。這意味着你需要看看你想象的情景是否存在。創建大量記錄,然後衡量查詢的性能。使用'EXPLAIN'來查看MySQL的作用,以及它是否真的消耗時間 - 那麼是時候進行優化了。 – 2014-11-05 11:56:13

回答

2

我將短語這一點使用exists而不是in

SELECT id 
FROM images i 
WHERE EXISTS (SELECT 1 FROM user u WHERE u.image = i.id) OR 
     EXiSTS (SELECT 1 FROM user u WHERE u.imageSmall = i.id) OR 
     EXISTS (SELECT 1 FROM books b WHERE b.image = i.id); 

出於性能,請確保您有以下指標:

create index idx_user_image on user(image); 
create index idx_user_imageSmall on user(imageSmall); 
create index idx_books_image on books(image); 
0

使用聯接,而不是許多選擇中選擇,和DISTINCT返回唯一值:

SELECT DISTINCT(i.id) FROM images i 
INNER JOIN `user` u 
INNER JOIN `books` b 
WHERE b.image=i.id OR b.imageSmall=i.id OR u.image=i.id OR u.imageSmall=i.id 
相關問題