- 用 where 替代 order by:
ORDER BY
子句只在两种严格的条件下使用索引: ①ORDER BY
中所有的列必须包含在相同的索引中并保持在索引中的排列顺序; ②ORDER BY
中所有的列必须定义为非空;
低效: (索引不被使用)
SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE
高效: (使用索引)
SELECT DEPT_CODE FROM DEPT WHERE DEPT_TYPE > 0
- 避免索引列的类型转换:
假设 EMP_TYPE 是一个字符类型的索引列.
SELECT … FROM EMP WHERE EMP_TYPE = 123
这个语句被转换为:SELECT … FROM EMP WHERE EMP_TYPE='123'
; 因为内部发生的类型转换, 这个索引将不会被用到! 为了避免 ORACLE 对你的 SQL 进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE 会优先转换数值类型到字符类型。
- 优化 Group by
提高
GROUP BY
语句的效率, 可以通过将不需要的记录在GROUP BY
之前过滤掉。下面两个查询返回相同结果但第二个明显就快了许多。
低效:
SELECT JOB , AVG(SAL) FROM EMP GROUP by JOB HAVING JOB = ‘PRESIDENT' OR JOB = ‘MANAGER'
高效:
SELECT JOB , AVG(SAL) FROM EMP WHERE JOB = ‘PRESIDENT' OR JOB = ‘MANAGER' GROUP by JOB
- 避免使用耗费资源的操作:
带有
DISTINCT
,UNION,MINUS
,INTERSECT
,ORDER BY
的 SQL 语句会启动 SQL 引擎执行耗费资源的排序(SORT)功能.DISTINCT
需要一次排序操作, 而其他的至少需要执行两次排序. 通常, 带有UNION
,MINUS
,INTERSECT
的 SQL 语句都可以用其他方式重写. 如果你的数据库的 SORT_AREA_SIZE 调配得好, 使用 UNION , MINUS, INTERSECT 也是可以考虑的, 毕竟它们的可读性很强。
- 在运行代码中,尽量使用
PreparedStatement
来查询,不要用Statement
。
MySQL 常用的索引优化方法
MySQL 数据库的优化目标、常见误区和基本原则
优化目标
-
MySQL 数据库是常见的两个瓶颈是 CPU 和 I/O