mysql性能优化-简易版

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) as2016电影数量' 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

时间: 2024-10-06 10:59:30

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

MySQL · 性能优化 · SQL错误用法详解

前言 MySQL在2016年仍然保持强劲的数据库流行度增长趋势.越来越多的客户将自己的应用建立在MySQL数据库之上,甚至是从Oracle迁移到MySQL上来.但也存在部分客户在使用MySQL数据库的过程中遇到一些比如响应时间慢,CPU打满等情况.阿里云RDS专家服务团队帮助云上客户解决过很多紧急问题.现将<ApsaraDB专家诊断报告>中出现的部分常见SQL问题总结如下,供大家参考. 常见SQL错误用法 1. LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如

MySQL性能优化总结(转)

一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图:   三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件.首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm文件,另外还有.MYD和.MYI文件,分别存放了表的数据(.MYD)和索引数据(.MYI).每个表都有且仅有这样三个文件做为MyISAM存储类型的表的存储,也就是说不管这个

MySQL · 性能优化 · MySQL常见SQL错误用法

前言 MySQL在2016年仍然保持强劲的数据库流行度增长趋势.越来越多的客户将自己的应用建立在MySQL数据库之上,甚至是从Oracle迁移到MySQL上来.但也存在部分客户在使用MySQL数据库的过程中遇到一些比如响应时间慢,CPU打满等情况.阿里云RDS专家服务团队帮助云上客户解决过很多紧急问题.现将<ApsaraDB专家诊断报告>中出现的部分常见SQL问题总结如下,供大家参考. 常见SQL错误用法 1. LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如

php导入大量数据到mysql性能优化技巧_php技巧

本文实例讲述了php导入大量数据到mysql性能优化技巧.分享给大家供大家参考.具体分析如下: 在mysql中我们结合php把一些文件导入到mysql中,这里就来分享一下我对15000条记录进行导入时分析与优化,需要的朋友可以参考一下. 之前有几篇文章,说了最近tiandi在帮朋友做一个小项目,用于统计电话号码的,每次按需求从数据库里随机生成打包的电话号码,然后不停地让人打这些电话号码推销产品(小小鄙视一下这样的行为).但是朋友要求帮忙,咱也不能不帮啊,是吧.程序两个星期前已经做好,测试完毕交工

mysql性能优化之索引优化_Mysql

作为免费又高效的数据库,mysql基本是首选.良好的安全连接,自带查询解析.sql语句优化,使用读写锁(细化到行).事物隔离和多版本并发控制提高并发,完备的事务日志记录,强大的存储引擎提供高效查询(表记录可达百万级),如果是InnoDB,还可在崩溃后进行完整的恢复,优点非常多.即使有这么多优点,仍依赖人去做点优化,看书后写个总结巩固下,有错请指正. 完整的mysql优化需要很深的功底,大公司甚至有专门写mysql内核的,sql优化攻城狮,mysql服务器的优化,各种参数常量设定,查询语句优化,主

详解MySQL性能优化(一)_Mysql

一.MySQL的主要适用场景1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图:   三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件.首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm文件,另外还有.MYD和.MYI文件,分别存放了表的数据(.MYD)和索引数据(.MYI).每个表都有且仅有这样三个文件做为MyISAM存储类型的表的存储,也就是说不管这个表

19个MySQL性能优化要点解析_Mysql

以下就是跟大家分享的19个MySQL性能优化主要要点,一起学习学习. 1.为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了. 这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的.因为,我们某些查询语句会让MySQL不使用缓存.请看下面的示例: // 查询缓存不开启 $r = mysq

Mysql性能优化案例研究-覆盖索引和SQL_NO_CACHE_Mysql

场景 产品中有一张图片表pics,数据量将近100万条,有一条相关的查询语句,由于执行频次较高,想针对此语句进行优化 表结构很简单,主要字段: 复制代码 代码如下: user_id 用户ID picname 图片名称 smallimg 小图名称 一个用户会有多条图片记录,现在有一个根据user_id建立的索引:uid,查询语句也很简单:取得某用户的图片集合: 复制代码 代码如下: select picname, smallimg from pics where user_id = xxx; 优化

MySQL性能优化的最佳20+条经验_Mysql

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被My