sql - 需要帮助优化 MySQL 查询

标签 sql mysql query-optimization

我有一个复杂的 SQL 查询,其中包含我想要优化的嵌套“子查询”

    SELECT
'likes' `type`,
entry_date item_date,
CASE `type`
    WHEN 'entry_id' THEN entry_id
    WHEN 'member_id' THEN f.member_id
    WHEN 'topic_id' THEN entry_id
END    
AS item_id,
CASE `type`
    WHEN 'entry_id' THEN (SELECT title FROM exp_weblog_titles WHERE entry_id=item_id)
    WHEN 'member_id' THEN (SELECT screen_name FROM exp_members WHERE member_id=item_id)
    WHEN 'topic_id' THEN (SELECT title FROM exp_forum_topics WHERE topic_id=item_id)
END    
AS item_title,
CASE `type`
    WHEN 'member_id' THEN (SELECT username FROM exp_members WHERE member_id=item_id)
    ELSE ''
END    
AS  item_url_title,
f.type parent_type,
CASE `type`
    WHEN 'entry_id' THEN (SELECT weblog_id FROM exp_weblog_titles WHERE entry_id=item_id)
    WHEN 'member_id' THEN ''
    WHEN 'topic_id' THEN (SELECT forum_id FROM exp_forum_topics WHERE topic_id=item_id)
END    
AS parent_id,
CASE `type`
    WHEN 'entry_id' THEN ''
    WHEN 'member_id' THEN ''
    WHEN 'topic_id' THEN (SELECT forum_name FROM exp_forums WHERE forum_id=parent_id)
END    
AS parent_title,         
m.member_id actor_member_id,
screen_name actor_screen_name,
username actor_username,
photo_filename actor_photo,
avatar_filename actor_avatar
FROM exp_favorites f, exp_members m
WHERE f.member_id=m.member_id

正如您所注意到的,在子查询中,某些表会针对同一行但不同的字段进行多次查询。
就像,我有

SELECT screen_name FROM exp_members WHERE member_id=item_id  

SELECT username FROM exp_members WHERE member_id=item_id  

我希望看到结合起来可以最大限度地减少请求数量和服务器负载。

有办法做到这一点吗?有什么建议吗?

UPD。表结构如下:
创建表 exp_favorites (
favorites_id int(10) 无符号 NOT NULL auto_increment,
type varchar(16) NOT NULL 默认 'entry_id',
author_id int(10) unsigned NOT NULL 默认 '0',
entry_id int(10) 无符号 NOT NULL,
member_id int(10) 无符号 NOT NULL,
site_idsmallint(3) 无符号 NOT NULL 默认 '1',
entry_date int(10) 无符号 NOT NULL,
注释文本不为空,
public char(1) NOT NULL 默认 'y',
主键(favorites_id),
KEY author_id (author_id),
KEY entry_id (entry_id),
KEY member_id (member_id),
KEY site_id (site_id),
KEY public (public),
KEY 类型(类型)
)

最佳答案

你可以这样做:

SELECT
'likes' `type`,
entry_date item_date,
CASE `type`
    WHEN 'entry_id' THEN entry_id
    WHEN 'member_id' THEN f.member_id
    WHEN 'topic_id' THEN entry_id
END    
AS item_id,
CASE `type`
    WHEN 'entry_id' THEN wt.title
    WHEN 'member_id' THEN m2.screen_name
    WHEN 'topic_id' THEN ft.title
END    
AS item_title,
...
FROM exp_favorites f
inner join exp_members m ON f.member_id=m.member_id
left outer join exp_weblog_titles wt on wt.entry_id=f.item_id
left outer join exp_members m2 on m2.entry_id=f.item_id
left outer join exp_forum_topics ft on ft.entry_id=f.item_id

关于sql - 需要帮助优化 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3781196/

相关文章:

mysql - 在组内排序?

sql - 索引查询优化 = SQL

php - 将 mysql_query 结果传递给 foreach

sql - 使用 Zend DB 编写子查询

python - alembic:将 id 字段添加到现有表

mysql - 请问 "decay"有可能是SQL信息吗?

mysql - MySQL中的短,单字段索引或大量覆盖索引

mysql - 为什么我的 MySQL 表上的索引没有被使用?

mysql - 从具有重复项的列中获取所有值

mysql - SQL 查询具有多个外键的表?