Ivan-yy

导航

mysql查询优化总结

  1. number类型的索引列查询条件为String时不会用到索引,反之一样.
  2. 遵循最左前缀的原则下,能用联合索引就不要创建多个单列索引,联合索引在多列索引条件都用到时过滤性更强.(当创建a,b联合索引时,即时你的查询是 select xx from xx where b = xx and a = xx, 也会用到索引,mysql在解析完sql后会通过优化器优化你的sql.mysql一个表最多创建16个索引)
  3. 复杂的sql优化时,可以分步拆分子查询,explain子查询,着重优化耗时较长的子查询,目标是减少rows,走到索引(mysql主键聚簇索引效率最快,叶子节点保存整行数据,二级索引即普通列上的索引叶子节点保存的是主键的值,不是存储行指针!需要再到聚簇索引中查询对应的行数据,即回表.可通过覆盖索引防止回表查询,覆盖索引就是在查询结果的列上建立联合索引).
  4. 分页查询优化:mysql的 limit m,n 会扫描m + n行数据,丢掉m前行数据,当m较大时会造成查询性能严重下降,最好的解决方法是通过自增主键筛选当前页数据.
    假设table student(id,name,sex,desc,phone,addr) sql: select ... from student where ... limit pageSize(curPage-1), pageSize
    (1) select ... from student where id > pageSize
    (curPage-1) order by id limit pageSize --性能最好的优化
    (2) select ... from student s left join (select id from student limit pageSize*(curPage-1),pageSize) s1 on s.id = s1.id limit pageSize -- 性能较第一种略差,利用主键索引,可以不需要严格递增主键.

posted on 2020-11-07 16:25  Ivan-yy  阅读(59)  评论(0编辑  收藏  举报