我有CL_USER
个表,其中的varchar列为login
:
CREATE TABLE CL_USER (...
`LOGIN` varchar(15) NOT NULL...
ALTER TABLE `CL_USER`
ADD UNIQUE INDEX `CL_USER_INDEX_LOGIN`(`LOGIN`);
我有一个带有按登录过滤器的选择查询。我发现包含LIKE '%'
的选择会极大地降低性能。以下是一些测量结果(每个查询3次):
1. SELECT COUNT(*) FROM CL_STATISTICS s, CL_USER u
WHERE s.pk <= 180735 AND s.user_pk = u.pk AND s.game_type = 7 AND u.login LIKE '%'
duration: 0.409146, 0.46557125, 0.44063275
2. SELECT COUNT(*) FROM CL_STATISTICS s, CL_USER u
WHERE s.pk <= 180735 AND s.user_pk = u.pk AND s.game_type = 7
duration: 0.2063145, 0.193227, 0.21384825
3. SELECT COUNT(*) FROM CL_STATISTICS s, CL_USER u
WHERE s.pk <= 180735 AND s.user_pk = u.pk AND s.game_type = 7 AND u.login LIKE 'p%'
duration: 0.031623, 0.0364385, 0.0400135
看起来很奇怪,为什么查询1和2不相同?
答案 0 :(得分:0)
请使用kickers$fantasy_points_added <- dplyr::case_when(
kickers$field_goal_result == "good" & kickers$kick_distance < 40 ~ 3,
kickers$field_goal_result == "good" & kickers$kick_distance > 39 & kickers$kick_distance < 50 ~ 4,
kickers$field_goal_result == "good" & kickers$kick_distance > 49 ~ 5,
TRUE ~ NA
)
,而不是逗号。
请为其他表格提供JOIN .. ON
。
请为每个查询提供SHOW CREATE TABLE
。他们可能提供了很好的线索-使用哪些索引以及首先使用哪个表。可能首先将EXPLAIN SELECT ...
用于第三个查询。
user
需要s
有或没有INDEX(game_type, pk)
的{{1}}是否相同?如果相同,则说明是不必要执行COUNT(*)
以确保两个表中都存在一行。
真正的解决方案是花更多的精力来构建查询。如果对用户没有限制,请不要加入JOIN
。