文章目录
索引失效的情况
此段来自
- 即上述的隐式类型转换导致索引失效;
错误的例子:select * from test where t_table=12345;
正确的例子:select * from test where t_table='12345';
- 什么是隐式转换
MySQL在进行字段对比时,如果两个参数类型不一致,此时便会进行类型转换。让他们可以进行比较。你可以在sql中进行显示转换,或者在执行时自动进行隐式转换(应该避免,效率低且容易出错)
总之以后sql语句的字段记得加引号就是了
- 对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(+,-,*,/,! 等)
错误的例子:select * from test where id-1=9;
正确的例子:select * from test where id=10;
- 使用Oracle内部函数导致索引失效.对于这样情况应当创建基于函数的索引.
错误的例子:select * from test where round(id)=10; 说明,此时id的索引已经不起作用了
正确的例子:首先建立函数索引,create index test_id_fbi_idx on test(round(id));
然后 select * from test where round(id)=10; 这时函数索引起作用了
-
以下使用会使索引失效,应避免使用;
a. 使用 <> 、not in 、not exist、!=
b. like “%_” 百分号在前(可采用在建立索引时用reverse(columnName)这种方法处理)
c. 单独引用复合索引里非第一位置的索引列.应总是使用索引的第一个列,如果索引是建立在多个列上, 只有在它的第一个 列被where子句引用时,优化器才会选择使用该索引。
d. 字符型字段为数字时在where条件里不添加引号.
e. 当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。 -
不要将空的变量值直接与比较运算符(符号)比较。
如果变量可能为空,应使用 IS NULL 或 IS NOT NULL 进行比较,或者使用 ISNULL 函数。 -
where条件中使用or索引不起作用?where条件中使用or,索引就会失效,会造成全表扫描 是误区
a. 要求使用的所有字段,都必须建立索引。
b. 数据量太少,制定执行计划时发现全表扫描比索引查找更快。
c. 确保mysql版本5.0以上,且查询优化器开启了index_merge_union=on, 也就是变量optimizer_switch里存在index_merge_union且为on
统计age字段大于20的数量
SELECT SUM(CASE WHEN Fab > 20 then 1 else 0 end) from t_tale;
使用case when
语句