mysql查询中多IF条件、ORDER BY的查询优化
我有以下疑问mysql查询中多IF条件、ORDER BY的查询优化,mysql,query-optimization,Mysql,Query Optimization,我有以下疑问 SELECT wit_games.id AS gameId, wit_games.turn_count, wit_users.id AS opponentId, wit_users.username AS name, wit_users.login_section, wit_users.image, wit_users.email,
SELECT wit_games.id AS gameId,
wit_games.turn_count,
wit_users.id AS opponentId,
wit_users.username AS name,
wit_users.login_section,
wit_users.image,
wit_users.email,
Ifnull( (SELECT
IF( wit_game_turns.user_id = 911,
IF(wit_game_turns.status = 1, 2, 3),
IF(wit_game_turns.status = 1, 4, 1))
FROM wit_game_turns
WHERE wit_game_turns.game_id = wit_games.id
ORDER BY wit_game_turns.id DESC
LIMIT 0, 1
),
IF(wit_games.participant1 = 911, 1, 3)
) AS turnSts
FROM wit_games
LEFT JOIN wit_users
ON wit_users.id =
IF(wit_games.participant1 = 911, wit_games.participant2,
wit_games.participant1)
WHERE wit_games.status = 1
AND ( wit_games.participant1 = 911
OR wit_games.participant2 = 911 )
ORDER BY turnsts DESC,
wit_users.login_sts DESC,
wit_games.id
LIMIT 0, 100
执行此查询花费了5秒钟解释给出以下结果
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY wit_games index_merge participant1,participant2 participant1,participant2 4,4 NULL 664 Using union(participant1,participant2); Using wher...
1 PRIMARY wit_users eq_ref PRIMARY,id_2 PRIMARY 4 func 1
2 DEPENDENT SUBQUERY wit_game_turns index game_id PRIMARY 4 NULL 1 Using where rows Extra
1 PRIMARY wit_games index_merge participant1,participant2 participant1,participant2 4,4 NULL 664 Using union(participant1,participant2); Using wher...
1 PRIMARY wit_users eq_ref PRIMARY,id_2 PRIMARY 4 func 1
2 DEPENDENT SUBQUERY wit_game_turns index game_id PRIMARY 4 NULL 1 Using where
我索引了用户名、电子邮件、参与者1、参与者2、游戏id
如何优化此查询以获得更好的性能
表结构如下所示
机智游戏
智能用户
机智游戏
提前感谢。我已尝试优化您的查询。您可以测试它是否工作正常。 如果你能提供一些样本数据就更好了
SELECT
wu.id AS opponentId,
wu.username AS name,
wu.login_section,
wu.image,
wu.email,
wg.id,
wg.turn_count,
IFNULL(wg.participant1,wg.participant) turnSts
FROM wit_users wu
LEFT JOIN (
SELECT
wit_games.id,
wit_games.turn_count,
IF(participant1 = 911, 1, 3) participant,
IF(wgt.user_id = 911, IF(wgt.status = 1, 2, 3), IF(wgt.status = 1, 4, 1)) participant1
FROM wit_games
INNER JOIN wit_game_turns wgt ON wgt.game_id = wit_games.id
WHERE status = 1
AND 911 IN (participant1,participant2)
) AS wg ON wg.participant_id = wu.id
ORDER BY turnsts DESC, wu.login_sts DESC, wg.id
LIMIT 0, 100
这是一个可怕的问题。我们可以从handware的实际问题开始吗?你想用这个查询做什么?你在什么条件下需要这些东西?
Column Type
id int(11)
login_section int(2)
fb_id bigint(200)
access_token text
gcmId varchar(200)
deviceTocken varchar(1000)
email varchar(50)
username varchar(50)
password varchar(150)
image varchar(500)
status int(2)
login_sts smallint(1)
loggedInDevice int(2)
points float
lang_id int(11)
badge int(11)
Column Type
id int(11)
game_id int(11)
text_id int(11)
video longblob
user_id int(11)
reply_user_id int(11)
reply_text varchar(100)
points float
has_bonus int(2)
added_date datetime
status smallint(1)
SELECT
wu.id AS opponentId,
wu.username AS name,
wu.login_section,
wu.image,
wu.email,
wg.id,
wg.turn_count,
IFNULL(wg.participant1,wg.participant) turnSts
FROM wit_users wu
LEFT JOIN (
SELECT
wit_games.id,
wit_games.turn_count,
IF(participant1 = 911, 1, 3) participant,
IF(wgt.user_id = 911, IF(wgt.status = 1, 2, 3), IF(wgt.status = 1, 4, 1)) participant1
FROM wit_games
INNER JOIN wit_game_turns wgt ON wgt.game_id = wit_games.id
WHERE status = 1
AND 911 IN (participant1,participant2)
) AS wg ON wg.participant_id = wu.id
ORDER BY turnsts DESC, wu.login_sts DESC, wg.id
LIMIT 0, 100