谁能建议一个好的索引来使此查询更快地运行?
SELECT
s.*,
sl.session_id AS session_id,
sl.lesson_id AS lesson_id
FROM
cdu_sessions s
INNER JOIN cdu_sessions_lessons sl ON sl.session_id = s.id
WHERE
(s.sort = '1') AND
(s.enabled = '1') AND
(s.teacher_id IN ('193', '1', '168', '1797', '7622', '19951'))
解释:
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra
1 | SIMPLE | s | NULL | ALL | PRIMARY | NULL | NULL | NULL | 2993 | 0.50 | Using where
1 | SIMPLE | sl | NULL | ref | session_id,ix2 | ix2 | 4 | ealteach_main.s.id | 5 | 100.00 | Using index
cdu_sessions看起来像这样:
------------------------------------------------
id | int(11)
name | varchar(255)
map_location | enum('classroom', 'school'...)
sort | tinyint(1)
sort_titles | tinyint(1)
friend_gender | enum('boy', 'girl'...)
friend_name | varchar(255)
friend_description | varchar(2048)
friend_description_format | varchar(128)
friend_description_audio | varchar(255)
friend_description_audio_fid | int(11)
enabled | tinyint(1)
created | int(11)
teacher_id | int(11)
custom | int(1)
------------------------------------------------
cdu_sessions_lessons包含3个字段-id,session_id和lesson_id
谢谢!
最佳答案
首先,编写查询,因此不需要类型转换。 where
子句中的所有比较都是对数字的比较,因此请使用数字常量:
SELECT s.*,
sl.session_id, -- unnecessary because s.id is in the result set
sl.lesson_id
FROM cdu_sessions s INNER JOIN
cdu_sessions_lessons sl
ON sl.session_id = s.id
WHERE s.sort = 1 AND
s.enabled = 1 AND
s.teacher_id IN (193, 1, 168, 1797, 7622, 19951);
尽管在这种特定情况下可能不会发生,但是混合类型可能会妨碍索引的使用。
我删除了该列作为别名(例如
as session_id
)。这些是多余的,因为列名是别名,并且查询没有更改名称。对于此查询,请首先查看
WHERE
子句。所有列引用均来自一张表。这些应该放在索引中,首先进行相等比较:create index idx_cdu_sessions_4 on cdu_sessions(sort, enabled, teacher_id, id)
我添加了
id
,因为它也在JOIN
中使用。正式地,如果
id
是主键,则不需要在索引中。但是,如果我想要在那里,我喜欢明确。接下来,您要为第二张表创建索引。从那里仅引用两列,因此它们都可以进入索引。第一列应该是
join
中使用的列:create index idx_cdu_sessions_lessons_2 on cdu_sessions_lessons(session_id, lesson_id);
关于mysql - 需要简单查询的索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54252290/