简单的几点Sql优化

  1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

  2. 应尽量避免在 where 子句中对字段进行 null 值判断is not null,否则将导致引擎放弃使用索引而进行全表扫描,如:

    解决方案: 可以在改字段上设置默认值,确保表中没有null值,否则会全表扫描。

  3. 应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。

  4. 应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

    select id from t where num=10 or num=20
    -- 可以这样查询:
    select id from t where num=10 union all select id from t where num=20
    
  5. in 和 not in 也要慎用,否则会导致全表扫描,如:

    select id from t where num in(1,2,3) 
    -- 对于连续的数值,能用 between 就不要用 in 了:
    select id from t where num between 1 and 3
    
  6. 在使用模糊查询的时候,最好前面不要加%,否则会全表扫描

  7. 应尽量避免在 where 子句中对字段进行计算表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:

    select id from t where num/2=100
    -- 应改为:
    select id from t where num=100*2
    
  8. 查询的时候,最好不要使用*, 而是在select后面加上列名

  9. 查询不需要的数据。解决办法:使用limit解决

  10. 分页查询不要直接使用limit offset,在页数较大的情况下,扫描的行数会增加,效率较慢
    SELECT t1.* FROM api_coll_data t1 inner join (select id from api_coll_data where source = '商品' limit 100, 20) t2 on t1.id = t2.id order by t1.id desc
    这种方式较为优化,如果source字段有索引,那么只需要扫描一棵索引树,就可以实现分页的查询,无需回表,可以使用到覆盖索引,效率较高

你可能感兴趣的:(面试题,mysql,索引,数据库,面试)