- 性能优化——查看sql执行计划
EXPLAIN :
MySQL提供了EXPLAIN 命令,他可以对select语句进行分析,并输出select执行的详细信息,以供开发人员针对性优化
使用EXPLAIN 这个命令来查看这些sql语句执行计划,查看有没有使用索引,有没有做全表扫描,通过explain命令深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。
用法:
expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra,下面对这些字段进行解释:
l id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.
l select_type:表示 SELECT 查询的类型.结果可有:
SIMPLE, 表示此查询不包含 UNION 查询或子查询
PRIMARY, 表示此查询是最外层的查询
UNION, 表示此查询是 UNION 的第二或随后的查询
DEPENDENT UNION, UNION 中的第二个或后面的查询语句, 取决于外面的查询
UNION RESULT, UNION 的结果
SUBQUERY, 子查询中的第一个 SELECT
DEPENDENT SUBQUERY: 子查询中的第一个 SELECT, 取决于外面的查询. 即子查询依赖于外层查询的结果.
l table: 表示查询的是哪个表
l partitions: 匹配的分区
l type: join 类型
l possible_keys: 此次查询中可能选用的索引
l key: 此次查询中确切使用到的索引.
l ref: 哪个字段或常数与 key 一起被使用
l rows: 显示此查询一共扫描了多少行. 这个是一个估计值.
l filtered: 表示此查询条件所过滤的数据的百分比
l extra: 额外的信息
- 性能优化——慢查询
数据库查询快慢是影响项目性能的一大因素,对于数据库,我们除了要优化 SQL,更重要的是得先找到需要优化的 SQL。
MySQL 数据库有一个“慢查询日志”功能,用来记录查询时间超过某个设定值的SQL,这将极大程度帮助我们快速定位到症结所在,
默认是关闭的,需要手动开启
查看是否开启:
slow_query_log :是否开启慢查询日志,ON 为开启,OFF 为关闭,如果为关闭可以开启
临时开启:
set global slow_query_log = ON;
set global long_query_time = 1;
永久开启:设置my.cnf配置文件
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
- 性能优化——分析语句Show profile
Profiler它是MySQL自带的一种诊断分析工具,通过它可以分析出一条sql语句的性能瓶颈在什么地方
explain、slow query log 这两种都无法做到精确分析,但是,query profiler却可以定位出一条sql语句执行的各种资源消耗情况,比如CPU、io等,以及sql执行所消耗的时间等,(只有在MySQL 5.0.37以上版本才可以实现)
默认是关闭的,需手动开启。
show profiles :以列表形式显示最近发送到服务器上执行的语句的资源使用情况.显示的记录数由变量:profiling_history_size 控制,默认15条
show profile: 展示最近一条语句执行的详细资源占用信息,默认显示 Status和Duration两列,可以根据query-ID,选择显示某条记录的性能分析信息。
profiling控制,默认是OFF关闭状态。
查看是否开启:select @@profiling;
show variables like ‘%profil%’;
开启:set profiling=1; --1是开启、0是关闭
正确的使用引擎:
在 MySQL 中有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊
MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。
InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。