提高SQL Query的性能,从多列中的不同表中选择ID

时间:2014-11-05 11:47:57

标签: php mysql performance

让我们假设我有以下表结构

表:图像

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部分,此查询可能非常耗时且根本不具备性能。有没有办法提高此查询的性能?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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