Mysql Force Index 不起作用, 用 IGNORE INDEX 来顶替
表author_r有100W左右数据, 表中有多个索引:
1. Inx_SNS_Website_Code(SNS_Website_Code)
2. Inx_Pair_Author_Raw_ID(Pair_Author_Raw_ID)
3. Inx_Author_RawID(Author_Raw_ID)
4. Inx_Time_S_Code_RType_RawID(Extracted_Time, SNS_Website_Code, R_Type, Author_Raw_ID, Pair_Author_Raw_ID)
下面SQL中的查询结果有300条:
1. 走索引Inx_Author_RawID,Inx_Pair_Author_Raw_ID是最快的
2. 但默认走Inx_SNS_Website_Code索引, 特别慢.
3. 调试: 设置强制走索引Force Index(Inx_Time_S_Code_RType_RawID), EXPLAIN发现没走索引, 即强制不成功
强制走 Inx_Author_RawID, Inx_Pair_Author_Raw_ID索引也不成功
4. 后来发现还有IGNORE INDEX, 尝试IGNORE INDEX(Inx_SNS_Website_Code), 此时走的索引是Inx_Time_S_Code_RType_RawID, 速度还是很慢, 原因是时间跨度太大
5. 最后IGNORE INDEX(Inx_SNS_Website_Code,Inx_Time_S_Code_RType_RawID), 走索引(Inx_Author_RawID,Inx_Pair_Author_Raw_ID), 速度很快.
疑问: 不知为啥 Force Index 会不成功? 知道的朋友麻烦告知一下.
SELECT ar.* FROM `author_r` ar IGNORE INDEX(Inx_SNS_Website_Code,Inx_Time_S_Code_RType_RawID) WHERE 1=1 and ar.Extracted_Time BETWEEN str_to_date('1970-11-01 00:00:00','%Y-%m-%d %H:%i:%s') and str_to_date('2012-11-28 23:59:59','%Y-%m-%d %H:%i:%s') and ar.SNS_Website_Code='TW' and ar.R_Type in ('F','I','R','LL') and ( Author_Raw_ID in ('tw_tabelogcospe') or Pair_Author_Raw_ID in ('tw_tabelogcospe') ) order by Pair_Name asc limit 300;