我有两个表,客户端将使用用户名进行搜索,该用户名将在用户表中搜索记录和用户ID,然后在rooms表中搜索并返回结果,但是我的当前代码似乎很慢。
我的房间表中有大约750,000条记录,而用户表中有大约550,000条记录,因此我的搜索结果通常需要5到7秒的时间才能显示回客户端,下面是否可以替代我的代码?
SELECT
`rooms`.`id`,
`rooms`.`caption`,
`rooms`.`description`,
`rooms`.`roomtype`,
`rooms`.`owner`,
`rooms`.`state`,
`rooms`.`category`,
`rooms`.`users_now`,
`rooms`.`users_max`,
`rooms`.`model_name`,
`rooms`.`score`,
`rooms`.`allow_pets`,
`rooms`.`allow_pets_eat`,
`rooms`.`room_blocking_disabled`,
`rooms`.`allow_hidewall`,
`rooms`.`password`,
`rooms`.`wallpaper`,
`rooms`.`floor`,
`rooms`.`landscape`,
`rooms`.`floorthick`,
`rooms`.`wallthick`,
`rooms`.`mute_settings`,
`rooms`.`kick_settings`,
`rooms`.`ban_settings`,
`rooms`.`chat_mode`,
`rooms`.`chat_speed`,
`rooms`.`chat_size`,
`rooms`.`trade_settings`,
`rooms`.`group_id`,
`rooms`.`tags`,
`rooms`.`push_enabled`,
`rooms`.`pull_enabled`,
`rooms`.`enables_enabled`,
`rooms`.`respect_notifications_enabled`
FROM
`rooms`
JOIN `users` ON `users`.`id` = `rooms`.`owner`
WHERE
`users`.`username` = 'query'
ORDER BY
`rooms`.`users_now` DESC
LIMIT 50
说明计划:
1 SIMPLE users const PRIMARY,id,username username 128 const 1 Using index
1 SIMPLE rooms index owner users_now 4 50 Using where
我已经为适当的列建立了索引,但似乎仍然得到缓慢的结果。谢谢!
如我所见,您的结果基于users表,但应包含来自rooms表的数据。您可以通过两个查询而不是一个查询立即获得结果。首先获取您的users.id,然后获取结果并在rooms表中搜索匹配的所有者。
select users.id from users where username='search'
现在,使用刚得到的users.id数组在您的房间中运行一个全新的查询。ForEach代码取决于您使用的脚本语言。
尽管我承认这会为您的脚本付出更多的努力,但它肯定会立即加快您的速度。如果您的用户结果具有多个记录(即:如果将返回多个“ users.id”记录,则通过比较,此方法仍将很简单)仍然可以使用。如果有多个记录,则可以构造一个看起来像这样的数组,以允许单个查询获取所有房间:
select * from rooms where owner in ('id1','id2','id3')
另一种方法是:
select * from rooms where owner in (select users.id from users where username='search')
这种方法比较简单,看起来很便宜,但是效果很好。它将不返回用户数据,仅返回房间数据。第一种方法将允许您在第一个查询上捕获用户数据,并在第二个查询上捕获房间数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句