选择“喜欢'%'”会花费很多时间

时间:2019-08-06 07:48:36

标签: mysql query-performance

我有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不相同?

1 个答案:

答案 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