1、首先要避免全表扫描,检查是否有索引
  没有索引考虑是否建立索引(可以在经常需要查询的列上、需要排序的列上添加索引),mysql可以通过explain查看执行计划

2、查看索引是否生效(以下是索引失效的部分场景)
  不满足最左匹配原则
  like以%开头或者全模糊
  >、<号右边的索引会失效
  or也会导致索引失效(在or的两边都加索引才不会失效或者使用union(去重)、union all(不去重)替代or)
  !=、<>也会导致索引失效
  在where子句中使用表达式操作、函数操作等
3、sql语句结构的优化
  避免使用select*,不要返回不必要的字段,增加索引覆盖的概率
  尽量减少子查询(子查询会创建临时表,查询完毕删除临时表)
  调整where子句的连接顺序,将过滤数据多的条件放在前面,最快速度缩小结果集

mysql:其条件执行顺序是 从左往右,自上而下;where执行顺序是从左往右执行的,在数据量小的时候不用考虑,但数据量多的时候要考虑条件的先后顺序,
此时应遵守一个原则:排除越多的条件放在第一个
orcale:其条件执行顺序是从右往左,自下而上;由于解析是从下到上进行的,因此应该先编写表联接,然后再执行WHERE子句的任何条件,
并在联接完成后将筛选出最大记录的条件放在最后。

  尽量减少联表查询,联表查询是笛卡尔乘积的形式,检索的数据几何倍上升
  一次查询的结果最好不要过大,可以使用分页查询
4、数据库表设计的优化
  单表的字段最好不要超过20个。如果是比较大的表,有的字段使用的多,有的字段使用比较少,使用频率比较少的会拖慢查询速度
  表的结构是否合理(范式、反范式需要结合实际场景来决定)
  列类型的选择是否合适(能用int却用了bigint等)