难点描述: 明明字段上建立了索引,Explain 显示的 type 却是 ALL(全表扫描),导致查询极慢。这是一个非常隐蔽且常见的“坑”。
原理: 当 SQL 语句中查询条件的参数类型与数据库字段类型不一致时,MySQL 会自动进行类型转换。
典型案例: 字段 phone 是 VARCHAR 类型,建立了索引。查询时使用了 WHERE phone = 13800000000(数字类型)。
后果: MySQL 会将每一行 phone 字段的值转换为数字进行比较,这相当于对索引字段使用了函数操作 CAST(phone AS signed),导致 B+ 树索引失效。
解决方案:
严格匹配类型: 写 SQL 时,字符串一定要加单引号。
SQL
-- 正确写法
SELECT * FROM user WHERE phone = '13800000000';
规范开发: 在代码层(Java/Python/Go)的 ORM 映射中确保变量类型与数据库严格一致。


评论