谁能建议一个好的索引来使此查询更快地运行?

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/

10-16 22:57