我有两个复杂的ish sql语句。其中一个生成计数,另一个查询排行榜,排行榜有不同的列。在php脚本中,我只从第二个返回的查询中选择一行,然后合并第一个查询结果中的计数并将其返回给调用者。
问题:由于我对数据库进行两次查询,这会显着增加加载时间。我想结合两个查询来优化调用。
以下是我的疑问:
select count(*) as leaderboard_entry_history_tally
from leaderboard_entry
natural join user
natural join leaderboard where
(leaderboard_load_key = 'fr-en-colors' or leaderboard_load_key = '-fr-en-colors' )
and leaderboard_quiz_mode = '0' and user_id = 37
set @t1=0; select
NOW()-leaderboard_entry_timestamp as leaderboard_entry_age_in_some_units ,
TO_DAYS(NOW())-TO_DAYS(leaderboard_entry_timestamp) as leaderboard_entry_age_in_days , leaderboard_entry.user_id ,
leaderboard_entry.leaderboard_entry_id ,
leaderboard_entry.leaderboard_id ,
leaderboard_entry.leaderboard_entry_timestamp ,
leaderboard_entry.leaderboard_entry_friendly_load_key , leaderboard_entry.leaderboard_entry_session_uuid ,
leaderboard_entry.leaderboard_entry_num_mistakes ,
leaderboard_entry.leaderboard_entry_num_unique_cues ,
leaderboard_entry.leaderboard_entry_latitude ,
leaderboard_entry.leaderboard_entry_longitude ,
leaderboard_entry.leaderboard_entry_app_market_code ,
leaderboard.leaderboard_quiz_mode ,
leaderboard.leaderboard_load_key ,
leaderboard_entry.leaderboard_entry_elapsed_time_ms
from leaderboard_entry
natural join leaderboard
where (leaderboard_load_key = 'fr-en-colors' or leaderboard_load_key = '-fr-en-colors' )
and leaderboard_quiz_mode = '0'
and user_id in (37)
order by leaderboard_entry_timestamp desc limit 0, 1
我查看了其他已发布的解决方案。其中一些使用临时表,当我尝试它时似乎不起作用(得到语法错误)。
我也尝试过嵌套查询,但即使使用以下简单的东西也无法使用它:
select
(
select count(*) from leaderboard_entry
) , * from leaderboard_entry_timestamp
非常感谢任何帮助!
由于 猪
答案 0 :(得分:3)
如果速度是您的问题,那么我会确保您的架构中定义了外键及其索引。还要确保您搜索的所有条件项都有索引。
不确定语法(我是甲骨文家伙),但也许是这样的:
如何添加外键:
ALTER TABLE leaderboard_entry ADD FOREIGN KEY(leaderboard_id)REFERENCES排行榜(leaderboard_id);
如何添加索引:
alter table leaderboard_entry 使用hash(leaderboard_id)添加索引;
此外,使用预准备语句和绑定变量也可以提供帮助。一旦完成,它将消除解析步骤。
以下是描述如何执行此操作的链接:
http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/
请参阅“准备好的陈述”部分。
答案 1 :(得分:1)
问题:由于我对数据库进行两次查询,这会显着增加加载时间。
事实并非如此。
您的性能不佳,因为您的查询未得到很好的优化(或根本没有)。所以不要以为1个查询的速度比2快。
此外 - 您无法合并这两个查询,因为它们会返回不同数量的列。