- 使用函数或表达式对索引列进行操作:
-- 创建表 CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), age INT ); -- 创建索引 CREATE INDEX idx_users_name ON users (name); -- 查询时使用函数操作索引列,索引将失效 SELECT * FROM users WHERE UPPER(name) = 'JOHN'; -- 查询时使用表达式操作索引列,索引将失效 SELECT * FROM users WHERE name LIKE '%doe%';
- 使用OR条件连接多个索引列:
-- 查询时使用OR条件连接多个索引列,索引将失效 SELECT * FROM users WHERE name = 'John' OR age = 20;
- 使用不等于(!=或<>)操作符:
-- 查询时使用不等于操作符,索引将失效 SELECT * FROM users WHERE age != 18;
- 使用NULL值进行查询:
-- 查询时使用NULL值进行查询,索引将失效 SELECT * FROM users WHERE name IS NULL;
- 对索引列进行范围查询:
-- 查询时对索引列进行范围查询,索引将失效 SELECT * FROM users WHERE age > 18;
- 数据量较小的表,MySQL可能会选择全表扫描而不使用索引:
-- 创建表 CREATE TABLE small_table ( id INT PRIMARY KEY, name VARCHAR(50), age INT ); -- 创建索引 CREATE INDEX idx_small_table_name ON small_table (name); -- 查询数据量较小的表,MySQL可能选择全表扫描而不使用索引 SELECT * FROM small_table WHERE name = 'John';
需要注意的是,索引失效的情况需要根据具体的查询场景和数据特点进行分析。在实际应用中,可以通过使用EXPLAIN语句来查看查询计划,以确定索引是否被正确使用。如果发现索引失效,可以考虑重新设计查询语句或调整索引来优化查询性能。