- 过慢
- 有的时候,在程序中打印 sql 执行的时间日志,发现很慢,但是单独查询发现不慢,是因为这些 sql 在等待前面的 sql 执行完成,这个时候可以配置 dao 有个连接池,多条连接并行查询
- 也可以调整 buffer pool,提高查询命中效率
- 可以通过
show status like 'Innodb_buffer_pool_%'查询一些命中率,计算方式1 - (Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests) * 100%,这个可以做在监控里面
- 可以通过
- Union:会创建临时表
- 直接 Union:会去重
- Unionall:不会去重
- 临时表:
- Union
- from 中的子查询
- distinct 并且有 order by 时
- order by 和 group by 子句已补样时
- EXPLAIN查看执行计划的 extra 中,有 Using Temporary 就会用到临时表
- 使用 between and 代替 in
- 不要使用 ! 或者 > 操作符
- join 一般比子查询效率高:如果有合适的索引的情况下
- 也可以使用如 MAX()的聚合函数代替子查询
- 限制子查询结果集大小
- join:
- 外连接:也可以在 join 前面显示加上 outer,不过一般省略
- left join:以左表符合条件的数据为准,右表不符合的直接显示为 NULL
- right join:以右表符合条件的数据为准,左表不符合的直接显示为 NULL
- full join:左表所有符合条件的数据 + 右表所有符合条件的数据,缺省数据补 NULL
- Mysql 不支持,PG 支持
- 内连接:
- 外连接:也可以在 join 前面显示加上 outer,不过一般省略
