mysql性能优化

sql语句优化

如何发现有问题的sql?

开启mysql慢查询

show variables like 'slow_query_log'

set global slow_query_log_file='/var/mysql/mysql_log/mysql-slow.log'

set global log_queries_not_using_index=on;

set global long_query_time=1

MySQL慢查日志分析工具之mysqldumpslow

mysqldumpslow 参数 日志文件路径

MySQL慢查日志分析工具之pt-query-digest

输出到文件:

pt-query-digest slow-log > slow_log.report

输出到数据库:

pt-query-digest slow-log -review h=127.0.0.1,D=test,p=root,P=3306,u=root,t=query_review --create-reviewtable --review-history t=hostname_slow

如何通过慢查日志发现有问题的SQL

查询次数多且每次耗时长的sql

通常为前几个查询sql

IO大的sql

pt-query-digestRows examine

未命中索引的sql

注意pt-query-digestRows examineRow Send的对比,Rows examine远远大于Row Send的sql。

通过explain查询和分析SQL的执行计划

explain sql语句

explain select id,username from student;

table:对应的表

type:最好到最差的连接类型const、eq_reg、ref(常见于连接查询中)、range、index和ALL(表扫描)

possible_keys:显示可能应用在这张表中的索引,如果为空,则表示没有可用的索引。

key:实际使用的索引,为空是表示没有用到索引

key_len:索引的长度。(越小越好)

ref:显示索引的哪一列被使用了,如果可能的话是一个常数。

rows:返回的行数

extra列返回值需要注意:

Using filesort:看到这个的话查询就需要优化了。

Using temporary:看到这个的话查询就需要优化了。一般会出现在group by和order by中。

Count()和Max()的优化

select max(pay_date) from order;

max:可以创建一个索引进行操作

count:

count(*)和count(id)的区别:*会统计所有行数,id只统计列不为NULL的行数

同时查出2015年和2016年电影的数量

select count(release_year='2016' OR NULL) as 2016电影数量',count(release_year='2015' OR NULL) as 2016电影数量' from film;

子查询的优化

通常情况下,一般将子查询优化为join的方式进行查询。但是优化时需要注意的是关联键是否存在一对多的关系,要注意重复数据

如果优化成join的方式出现数据重复句,可以使用distinct的方式进行去重处理。

group by的优化

优化前的写法:

eplain select actor.first_name, actor.last_name, c.cnt from sakila.actor inner join sakila.film_actor using(actor_id) group by file_actor.actor_id;

extra:using temporary; using filesort

group by 优化后的写法:

eplain select actor.first_name, actor.last_name, c.cnt from sakila.actor inner join ( select actor_id, count(*) as cnt from sakila.film_actor group by actor_id ) as c using(actor_id);

extra:using index

这样可以减少io等。

Limit查询的优化

limit常用于分页处理,同时会伴随order by从句的使用。因此在大多时候会使用filesort的方式进行,从而导致大量的IO

explain select id, name, sex from student order by name;

extra:using filesort

优化步骤1:使用索引键或者主键进行order by排序

explain select id, name, sex from student order by id limit 10, 5;

优化步骤2:使用过滤条件(避免数据量过大时扫描记录数过多的情况)

explain select id, name, sex from student where id > 10000 and id < 100005 order by id limit 1, 5;

索引优化

如何选择合适的列建立索引

1、where从句、order by从句、group by从句、on从句出现的列

2、索引字段越小越好

3、离散度(唯一值越多离散度越大)大的列放在联合索引的前面

索引优化SQL的方法

重复索引,如主键为id,又声明了unique(id)的索引

冗余索引,索引里面包好了主键。由于innodb中默认索引都包含了主键,因此没有必要在索引里面再次包含索引。

使用pt-duplicate-key-checker工具进行重复及冗余索引的检查

pt-duplicate-key-checker -uroot -ppassword -h 127.0.0.1

索引维护的方法

对于已经不再使用的索引进行删除

pt-index-usage -uroot -p'password' mysql-slow.log

数据库结构优化

选择合适的数据类型

1、使用可以存下数据的最小数据类型

2、使用简单的数据类型。int要比varchar处理上简单

3、尽可能使用not null属性

4、尽量少用text类型,非用不可时可以考虑分表

用int来存储日期时间,使用FROM_UNIXTIME和UNIX_TIMESTAMP进行转换。

使用bigint来存储IP地址,inet_aton(),inet_ntoa()来进行转换。

表的范式化优化

表的反范式化优化

以空间换取时间的方式

如果完全按照三范式的设计会导致关联表过多等一系列问题。

表的垂直拆分

解决表字段过多的问题

拆分原则:

  • 把不常用的字段放在一个表中
  • 把大字段独立放在一个表中
  • 把经常使用的字段放在一起

表的水平拆分

解决表数据量的问题,拆分后表结构是一样的。

存在问题:跨分区表查询、统计及后台报表操作

系统优化

数据库系统配置优化

参考:http://www.cnblogs.com/rwxwsblog/p/5785376.html

MySQL配置文件优化

参考:http://www.cnblogs.com/rwxwsblog/p/5792962.html

第三方配置工具使用

Percon Configuration Wizard

https://tools.percona.com/wizard

服务器硬件优化

参考:http://www.cnblogs.com/rwxwsblog/p/5785376.html

mysql性能优化-简易版的更多相关文章

  1. redmine在linux上的mysql性能优化方法与问题排查方案

    iredmine的linux服务器mysql性能优化方法与问题排查方案     问题定位:   客户端工具: 1. 浏览器inspect-tool的network timing工具分析   2. 浏览 ...

  2. Mysql - 性能优化之子查询

    记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...

  3. Mysql性能优化三(分表、增量备份、还原)

    接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ...

  4. [MySQL性能优化系列]提高缓存命中率

    1. 背景 通常情况下,能用一条sql语句完成的查询,我们尽量不用多次查询完成.因为,查询次数越多,通信开销越大.但是,分多次查询,有可能提高缓存命中率.到底使用一个复合查询还是多个独立查询,需要根据 ...

  5. [MySQL性能优化系列]巧用索引

    1. 普通青年的索引使用方式 假设我们有一个用户表 tb_user,内容如下: name age sex jack 22 男 rose 21 女 tom 20 男 ... ... ... 执行SQL语 ...

  6. MySQL性能优化:索引

    MySQL性能优化:索引 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序.数据库使用索引以找到特定值,然后顺指针找到包含该值的行.这样可以使对应于表的SQL语句执 ...

  7. mysql 性能优化方向

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  8. MySQL性能优化总结

    一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...

  9. MYSQL性能优化的最佳20+条经验

    MYSQL性能优化的最佳20+条经验 2009年11月27日 陈皓 评论 148 条评论  131,702 人阅读 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数 ...

随机推荐

  1. Mysql函数:Last_insert_id()语法讲解

    Mysql函数可以实现许多我们需要的功能,下面介绍的Mysql函数Last_insert_id()就是其中之一,希望对您学习Mysql函数能有所帮助. 自动返回最后一个INSERT或 UPDATE 查 ...

  2. angular-ngSanitize模块-$sanitize服务详解

    本篇主要讲解angular中的$sanitize这个服务.此服务依赖于ngSanitize模块. 要学习这个服务,先要了解另一个指令: ng-bing-html. 顾名思义,ng-bind-html和 ...

  3. mysql 调用外部程序

    一.下载 lib_mysqludf_sys: 下载地址:https://github.com/mysqludf/repositories 二.配置与使用: 1.解压之后,已经有了我们需要的 lib_m ...

  4. Tomcat 6 JNDI数据源详解

    数据库连接池这个概念应该都不陌生,在Java中连接池也就是数据库的连接池,它是一种采用连接复用的思想避免多次连接造成资源的浪费机制. 最常见的连接池就是DBCP和C30P了,在tomcat中默认使用的 ...

  5. ajax浅析---ScriptManager

    使用ScriptManager控件 它用来处理页面上的所有组件以及页面局部更新,生成相关的客户端代理脚本以便能够在JavaScript中访问Web Service,所有需要支持ASP.NET AJAX ...

  6. 今天微信群需要人家通过吗?是微信bug吗

    今天遇到微信群拉人的问题,所以来和大家取经,刚开始拉人一下就拉进去了,后来拉的需要人家通过,今天朋友些也帮我拉人也是这样的,所以想问下微信群扩容的问题.晚上有位朋友跟我说一次拉十个人,不能拉多,这样就 ...

  7. Mac 上真正替换LiveWriter 的工具 - ecto

    Mac 上真正替换LiveWriter 的工具 - ecto 13年开始使用mac.而后想把 windows 替换到.一直在寻找LiveWriter 的工具,至今终于找到 我先感谢这位博主 http: ...

  8. 【PHP面向对象(OOP)编程入门教程】4.如何抽象出一个类?

    上面已经介绍过了, 面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,所以我们首先要做的就是如何来声明类, 做出来一个类很容易,只要掌握基本的程序语法定义规则就可以做的出来,那么难点在那里呢 ...

  9. C#之正则表达式、异常处理和委托与事件

    正则表达式主要是为了处理和模式匹配复杂的字符串. int myInteger = 5; string intergerString = myInteger.ToString(); 就是将myInteg ...

  10. python 多线程就这么简单(转)

    多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...