SQL技巧

2019-08-29  本文已影响0人  wpf_register

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

猜你喜欢

热点阅读