0.查询时明确查询字段,不用星号*代替
//测试时可以这样写,但项目 中不能这样写
SELECT * FROM
1.负向条件查询不能使用索引
SELECT * FROM `t_sys_user` WHERE phone_number != '15199999999' ;
//not in,not exists 不是好的习惯,
//可以优化为in 查询
SELECT * FROM `t_sys_user` WHERE phone_number not in('15199999999','18671701111');
- 前导模糊查询不能使用索引
SELECT * FROM order where desc like '%XX';
可以优化为非前导
SELECT *FROM order where desc likn 'XX%'
- 在属性上进行计算不能使用索引
SELECT * FROM order WHERE YEAR(date) < '2019';
//即使date上建立了索引也会全表扫描,可优化为值计算
SELECT * FROM order where date < CURDATE();
或
SELECT * FROM order WHERE date < '2019-01-01'
- 允许为null的列查询有潜在的坑
单列索引不存null值,复合索引 不存在全为null的值。
如果列允许为null,结果可能不符合预期。
所以尽量用not null 约束或设置默认值
SELECT * FORM user WHERE name !='zhangsan';
如果name允许为null,索引不存null值,结果集中不包含这条
可以优化为
SELECT * FROM student WHERE Sname != '赵雷' OR Sname is NULL;
- 如果确认只有一条结果,limit 1 能提高效率
//虽然我们知道结果只有一条,但数据库并不知道,
//所以我们明确告诉它,让它主动停止游标移动
SELECT * FROM user where sid = '*** ***' limit 1
- 把计算放到业务层而不是数据库层,既能节省CPU,还可能有缓存效果。
SELECT * FROM order where date < curdate();
//可以优化一下
$curdate = date('Y-m-d');
$res = mysql_query('SELECT * FROM order where date < $curdate')
- 强制类型转换会全表扫描
//手机号是字符串形式的要加引号
SELECT * FROM user where phone = 13484474404
网友评论