以 Mysql 为例,其中索引 BTree 类型 。以下几种SQL设计会导致虽然使用了索引,但是索引不会生效,即引擎放弃使用索引而进行全表扫描:
- WHERE 子句中使用 != 或 <> 操作符。如
SELECT id FROM tests WHERE name!='Tony';
- WHERE 子句中对索引列使用 %前缀模糊查询。
SELECT id FROM tests WHERE name like'%Tony'; //或者 SELECT id FROM tests WHERE name like'%Tony%';
- WHERE 子句中对索引列使用 OR 来连接条件。
SELECT id FROM tests WHERE name ='Tony' or id=88;
- WHERE 子句中对索引列使用 NOT IN。
SELECT id FROM tests WHERE id not in(88,89);
- WHERE 子句中对索引列使用计算、函数、类型转换等操作。
SELECT id FROM tests WHERE substring(name,1,4)='Tony';
- WHERE 子句中对索引列使用参数。
SELECT id FROM tests WHERE name=@name;