为什么MySQL不是';你不使用我的全文索引吗?

为什么MySQL不是';你不使用我的全文索引吗?,mysql,sql,Mysql,Sql,我有以下疑问: EXPLAIN SELECT * FROM glean2_saves WHERE username = '1d85d5aed8b02b3d6b0c155a563293ef' AND ses_id = 'e4fa3ae216f5033fbd16d6c66370954c' AND save_status =1 ORDER BY id DESC 结果是: id select_type table type possible_keys key key_

我有以下疑问:

EXPLAIN SELECT *
FROM glean2_saves
WHERE username = '1d85d5aed8b02b3d6b0c155a563293ef'
AND ses_id = 'e4fa3ae216f5033fbd16d6c66370954c'
AND save_status =1
ORDER BY id DESC 
结果是:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  glean2_saves    ref     save_status,username,ses_id     save_status     2   const   286315  Using where; Using filesort
以下是我的索引:

Action  Keyname Type    Unique  Packed  Column  Cardinality Collation   Null    Comment
Edit Edit   Drop Drop   PRIMARY BTREE   Yes No  id  331837  A       
Edit Edit   Drop Drop   save_status BTREE   No  No  save_status 3   A   YES 
Edit Edit   Drop Drop   nickname    FULLTEXT    No  No  nickname    7374        YES 
Edit Edit   Drop Drop   username    FULLTEXT    No  No  username    7717        YES 
Edit Edit   Drop Drop   ses_id  FULLTEXT    No  No  ses_id  11442       YES 
我在右边的列上确实有索引,但是为什么不使用它们呢? 为什么它们在“可能的密钥”(保存状态、用户名、ses\U id)中,但实际上只使用了一个“密钥”:保存状态

如果没有索引,查询的时间太长(有时超过15秒),应该不到1秒。数据库中有超过330k个条目。

对于此查询,您需要一个包含
where
order by
子句的索引。该指数将是:

glean2_saves(username, ses_id, save_status, id)
请注意,因为要进行相等比较,所以前三列可以是任意顺序。但是最后一列需要是
id
,用于
orderby


至于MySQL为什么不使用单独的索引。比如说,合并
中的
子句的索引需要大量的工作,可能比扫描一个索引并对其余列进行测试需要更多的工作。

请注意,这篇文章的标题是不正确的。“全文”索引是指用于文本检索的索引。这个问题只是关于字符列上的常规索引。