ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 索引失效情况 1.不在索引上计算,自动或手动类型转换 2. mysql使用(!=或<>)的时候无法使用索引会导致全表扫描 3. `is null`, `is not null`无法使用索引 4. 字符串不加单引号索引失效 5. 少用or,用他连接时索引会失效 6. 复合索引,左前缀,不要跳过中间列 7. 存储引擎不能使用索引中范围条件右边的列 **复合索引,排序也算使用索引的顺序** **复合索引,排序也要符合左原则** # 强制和忽略索引 ~~~ explain select CustName,count(1) c from WorkOrder force index(ix_date) where CreateDate>'2016-5-1' and CreateDate<'2017-1-1' group by CustName having c>100 order by c desc; ~~~ **假如我不想用索引了怎么办?** 可以使用`ignore index()`,这个指令可以强制Mysql在查询时,不使用某索引 # 禁止使用查询缓存 `sql_no_cache` ~~~ select sql_no_cache count(*) from roi_summary; ~~~ # in和exists in 是把外表和内表作hash 连接, 而exists是对外表作loop循环,每次loop循环再对内表进行查询。 一直以来认为exists比in效率高的说法是不准确的。 如果查询的两个表大小相当,那么用in和exists差别不大。 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in: --- not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引; 而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。 # groupby * groupby本质上是先排序后分组,遵照索引建的最左前缀 * 当无法使用索引列,增大`max_length_for_sort_data`参数的设置+增大`sort_buffer_size`参数的设置 * where高于having,能写在where限定的条件就不要去having限定了