优化特定类型的查询
优化SQL_CALC_FOUND_ROWS
前文提到使用这个提示符可以获取限制前的行数,但是它会扫描符合条件的所有行。这个可用来做一个是分页时,后续还有多少页的功能,不过更好的方式是只显示个下一页,如果有数据显示到下一页的数据,如果没有提示到达了末尾。
优化UNION
MySQL通过创建并填充临时表的方式来执行UNION,因此很多优化无法在UNION查询中很好应用。所以需要手动将WHERE、LIMIT、ORDER BY等语句下推到UNION子查询中。
如果不是需要对结果去重,请使用UNION ALL。即使有ALL,MySQL也会将结果先存于临时表中,再读出,这很多时候是没有必要的。
静态查询分析
Percona Toolkit中的pt-query-advisor能够解析查询日志,分析查询模式,给出可能存在潜在问题的查询。
使用用户自定义变量
用户自定义变量是一个用来存储内容的临时容器。
SET @ONE := 1
它能够方便一些查询。不过一些场景需要注意
- 自定义变量的查询无法使用查询缓存
- 不能再常亮或者标识符的地方使用自定义变量。
- 生命周期在一个连接内有效
- 使用连接池或者持久化连接,可能会让一些不相干代码产生交互
- 5.0之前大小写敏感
- 不能显示声明类型
- 优化器可能会将其优化掉
- 赋值和顺序的时间点并不总是固定的,由优化器决定
- :=优先级较低,请使用括号
- 使用未定义的变量不会报错
例子之后再补吧,家里停电了…