【问题标题】:How can i optimize this query on a big database tables having million rows如何在具有数百万行的大型数据库表上优化此查询
【发布时间】:2015-08-24 18:11:37
【问题描述】:
SELECT l.player_id,game_group_type,game_type,no_of_card,room_group_type,device_type 
FROM rummy_player_login_master k 
JOIN 
(

        SELECT no_of_card,game_group_type,game_type,room_group_type,player_id,login_id 
        FROM rummy_game_type_master i 
        JOIN 
        (
            SELECT  game_type_id,  room_group_type,player_id,login_id 
            FROM rummy_room_group_master g 
            JOIN 
            ( 
                SELECT room_group_id ,player_id,login_id 
                FROM rummy_room_domain_group_mapping e  
                JOIN 
                (
                    SELECT  common_id,player_id,login_id 
                    FROM rummy_room_master c 
                    JOIN 
                    (
                        SELECT room_id ,player_id,login_id 
                        FROM rummy_room_session_master a 
                        JOIN  
                        (
                            SELECT MAX(session_id) AS session_id,player_id,login_id 
                            FROM rummy_room_session_player_mapping 
                            GROUP BY player_id 
                        ) b 
                        ON a.session_id = b.session_id 
                    ) d 
                    ON c.room_id = d.room_id
                ) f 
                ON e.common_id =f.common_id
            ) h 
            ON g.room_group_id = h.room_group_id
        ) j 
        ON i.game_type_id = j.game_type_id

) l 
ON k.login_id = l.login_id 
GROUP BY l.player_id

【问题讨论】:

  • 格式化代码。有点 - 仍然难以阅读。
  • 请为此查询中使用的所有表提供SHOW CREATE TABLE tablename
  • 这个问题需要更多的上下文。需要架构和解释。
  • 也许做一个Explain 并在帖子中显示会有所帮助...我们也不知道您的表结构...

标签: mysql query-optimization


【解决方案1】:

假设我弄清楚了哪些列正确地进入了哪些表,那么这个查询应该是等效的(或者甚至更好,因为在您的原始文件中滥用了 GROUP BY)。

SELECT 
rrspm.player_id,
rgtm.game_group_type,
rgtm.game_type,
rgtm.no_of_card,
rrgm.room_group_type,
rplm.device_type 
FROM rummy_room_session_player_mapping rrspm
LEFT OUTER JOIN rummy_room_session_player_mapping later_rrspm
ON later_rrspm.player_id = later_rrspm.player_id
AND later_rrspm.session_id > rrspm.session_id
INNER JOIN rummy_player_login_master rplm 
ON rrspm.login_id = rplm.login_id
INNER JOIN rummy_room_session_master rrsm 
ON rrsm.session_id = rrspm.session_id
INNER JOIN rummy_room_master rrm 
ON rrm.room_id = rrsm.room_id
INNER JOIN rummy_room_domain_group_mapping rrdgm
ON rrdgm.common_id = rrm.common_id
INNER JOIN rummy_room_group_master rrgm 
ON rrgm.room_group_id = rrdgm.room_group_id
INNER JOIN rummy_game_type_master rgtm
ON rgtm.game_type_id = rrgm.game_type_id
WHERE later_rrspm.session_id IS NULL

如果您仍需要提高性能,请尝试以下方法:

ALTER TABLE rummy_room_session_player_mapping
ADD INDEX `player_session` (`player_id`,`session_id`)

原始查询中的语法看起来与我开始使用数据库时遇到的困难相同,因为您没有正确地查看基于集合的数据。

如果我的查询有效,我建议您研究我所做的并了解您如何无需执行所有嵌套选择即可获得所需的内容。数据库本身会按照它需要的任何顺序放置东西,你只需要告诉它哪些列将适当的表连接在一起。

【讨论】:

  • 非常感谢。我会试试的。
猜你喜欢
  • 2021-09-24
  • 1970-01-01
  • 2015-06-27
  • 2023-01-05
  • 2018-12-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多