SQL技巧

作者: wpf_register | 来源:发表于2019-08-29 14:00 被阅读0次

    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
    

    相关文章

      网友评论

          本文标题:SQL技巧

          本文链接:https://www.haomeiwen.com/subject/pdfiectx.html