我的MySQL调优笔记

MySQL 数据库优化

慢查询开启

  • 开启慢查询日志 slow_query_log = on

  • 指定慢查询时间 long_query_time = 1

  • 记录没有使用索引的查询语句not_using_indexes=1

    慢日志:时间、主机、执行信息、执行内容

关闭缓存

一些修改数据和删除数据的操作会导致缓存无效,一定程度上影响了数据库性能,所以关闭缓存。query_cache_type = 0

查看慢查询SQL

MySQLDumpSlow 返回top 10 慢的查询语句

分析慢查询SQL

Explain执行计划,只会分析Select SQL执行的情况,例如:

explain select * from user where nick_name='%德华'; 那么就会给出这句SQL执行的详细情况,最主要是以下几个字段:

  • Id :查询中执行SQL查询子句或者操作表的先后顺序
  • type:表示MySQL在表中查到记录的方式,null > system > const > eq_ref > ref >fulltext >....> range > index > all 最差达到 range 类型,理想状态要达到 ref 类型
    • all:全表扫描,遍历全表,最慢。
    • index:全索引扫描,只遍历索引树。
    • range:范围索引扫描,between,in,or
    • ref:使用最左前缀,索引不是primary key或者unique索引情况,根据键值只查询到有限记录。
    • eq_ref:使用了primary key或者unique key作为索引。
  • possible_keys:查询涉及到的字段上若存在索引,则为possible_keys。
  • key:实际上使用的索引,没有则为null
  • rows:估计查到所需的记录需要读取的行数。

优化SQL—Profiling

想要优化一条Query,就必须清除这条Query的性能瓶颈在哪里,是消耗的CPU计算太多还是IO操作太多:

  • 开启 profiling ,set global profiling = on;
  • 查看相关变量:show profiles;可以找到对应Query语句的Query_ID,例如ID为87;
  • 分析Query的详细信息:show profile cpu,block io for query 87;

常用SQL语句优化

  • 避免select *,原因:无法覆盖索引导致回表,增加网络传输负载;

  • 避免在where子句中使用!= > < null判断 ,原因:放弃索引进行全表扫描;

  • 避免全表扫描:考虑在where order by涉及到的列上建立索引;

  • 使用union替代or,使用orrange 类型的查询;

  • 避免like前置%,导致索引失效;

  • 避免where后面带参数或者函数或者表达式操作;

  • 使用exists代替 in

  • join操作时,小表作为前驱表;

  • limit 10000,100优化成where id>9999 limit 100,如果id不连续可与id做内连接,如下优化:

    select u.* from user u join (select id from user limit 9999 ,100) as tmp on u.id=tmp.id

索引优化

  • 字符形式的字段需要带上引号,例如where name = 'jay'
  • 频繁查询的列考虑建立索引,频繁更新的字段不建立索引;
  • 避免重复量大的字段建立索引,例如性别;
  • 尽可能建立组合索引;
  • 尽量考虑复合索引,避免回表;

你可能感兴趣的:(mysql,java,MySQL调优,MySQL优化)