MySQL数据库优化

1-1MySQL优化简介

数据库优化的目的

避免出现页面访问错误

  • 由于数据库连接timeout产生5XX错误
  • 由于慢查询造成页面无法加载
  • 由于阻塞造成数据无法提交

增加数据库的稳定性

  • 很多数据库的问题都是由于低效查询引起的

优化用户体验

  • 流畅页面的访问速度
  • 良好的网站功能体验

可以从以下几个方面进行数据库优化

MySQL数据库优化:

1.SQL语句优化

2.有效的索引

3.数据库的表结构

4.Linux系统配置优化:打开的文件数等

5.硬件:更加适合数据库系统的cpu、更快的io:ssd等、更多的内存...

2-1数据准备

Sakila样本数据库介绍 

  • 下载Sakila样本数据库,下载地址http://downloads.mysql.com/docs/sakila-db.tar.gz(下载页面http://dev.mysql.com/doc/index-other.html)。
  • 导入sakila-schema.sql和sakila-data.sql文件
首先下载mysql5.7.18 zip安装包,配置环境变量
bin文件夹下建立my.ini
[mysqld]
basedir=E:\Program Files (x86)\mysql-5.7.24-winx64\mysql-5.7.24-winx64\bin
datadir=E:\Program Files (x86)\mysql-5.7.24-winx64\mysql-5.7.24-winx64\data
port=3306
character-set-server=utf8
[client]
port=3306
character-set=utf8 在mysql根目录下新建data文件夹
以管理员身份运行cmd命令
输入cd G:\Program Files\MySQL\MySQL Server 5.7\bin进入bin目录下
输入mysqld --initialize --user=mysql --console
记下最后一行产生的随机密码
接着输入mysqld --install
成功会显示Servers Successfully installed
控制台下输入net start mysql 启动mysql服务 修改密码:
mysql> set password=password('');
Query OK, 0 rows affected, 1 warning (0.00 sec)
source C:\Users\jiang\Desktop\sakila-db\sakila-db\sakila-schema.sql
source C:\Users\jiang\Desktop\sakila-db\sakila-db\sakila-data.sql
完成数据导入。

2-2 MySQL慢查日志的开启方式和存储格式

查看是否开启慢查询日志 show variables like 'slow_query_log'         set global slow_query_log =on
设置没有索引的记录到慢查询日志 set global log_queries_not_using_indexes=on

查看日志 show variables like '%log%';

查看超过多长时间的sql进行记录到慢查询日志 show variables like 'long_query_time'
设置慢查询的时间 set long_query_time=1

2-3 MySQL慢查日志分析工具之mysqldumpslow

慢查日志分析软件:mysqldumpslow

mysql官方分析软件 启用mysqldumpslow时首先要在workbench中设置basedir的路径才能避免报错

mysqldumpslow 在windows中是一个perl文件,所以需要你配置perl环境变量,并使用perl运行

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

慢查询分析工具2:pt-query-digest

输出到文件:pt-query-digest show-log > slow_log.report

输出到数据库表 pt-query-digest show.log -review \ h=127.0.0.1,D=test,p=root.P=3306,u=root,t=query_review \ --create-reviewtable \ --review-history t=hostname_show

具体参考:http://www.cnblogs.com/luyucheng/p/6265873.html

下载地址: wget http://www.percona.com/downloads/percona-toolkit/2.2.4/percona-toolkit-2.2.4.tar.gz

tar percona-toolkit-2.2.4.tar.gz

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

1.查询次数多且每次查询占用时间长的SQL 通常为pt-query-digest分析的前几个查询

2.IO大的SQL 注意pt-query-digest分析中的Rows examine项

3.未命中索引的SQL 注意pt-query-digest分析中的Rows examine和Row send 的对比

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

table:表名

type:连接的类型,const、eq_reg、ref、range、index和ALL

const:主键、唯一索引;eq_reg:主键、索引的范围查找;ref:连接的查找( join),

range:索引的范围查找;index:索引的扫描;All:表扫描

possible_keys:可能用到的索引

key:实际使用的索引

key_len:使用索引的长度,长度越短越好

rows:表扫描的行数

extra:Using filesort   Using temporary  使用外部文件或临时表存储结果,看到这两个就代表是要进行优化的

2-7 Count()和Max()的优化

1.对max()查询,可以为表创建索引,
例如 select max(payment_date) from payment;
可以对payment建立索引
create index idx_paydate on payment(payment_date); 然后在进行查询
max()使用索引,不需要扫描行了。称为覆盖索引
2、COUNT()的优化方法:
在一条SQL中同时查出2006年和2007年电影的数量——优化count()函数
错误的方式: SELECT COUNT(release_year='2006' OR release_year='2007') from film;
正确的方式:(利用NULL值不会被计数的特性)
SELECT COUNT(release_year='2006' OR NULL) as '2006年电影数量', count(release_year='2007' OR NULL) as '2007年电影数量' FROM film;
select count(year='2006' or null) as xx from tablename; 后面的or null会把为null的值跳过,不计入数量中。
这是利用了select count(col_name)的特点,指定列不为空的行数;
select count(*) 为所有行数。
EXPLAIN  SQL \G 显示好看
2-8 子查询的优化

子查询可以用join on查询优化(注意:如果两张表连接字段存在一对多的关系,需要进行去重distinct)

2-9 group by的优化

可以把

explain select actor.first_name,actor.last_name,count(*) from film_actor inner join actor on actor.actor_id = film_actor.actor_id group by actor.actor_id\G

改写为

explain select actor.first_name,actor.last_name,c.cnt from actor inner join (select actor_id,count(*) AS cnt from film_actor GROUP BY actor_id) AS c USING(actor_id)\G

2-10 limit的优化

limit常用于分页处理,时常会伴随order by从句使用,因此大多时候会使用Filesorts这样会造成大量的io问题

1.使用有索引的列或主键进行order by操作

2.记录上次返回的主键,在下次查询时使用主键过滤

即将:select film_id,description from sakila.film order by film_id limit 50,5;

改为:select film_id,description from sakila.film where file_id >55 and film_id<=60 order by film_id limit 1,5;

使用这种方式有一个限制,就是主键一定要顺序排序和连续的,如果主键出现空缺可能会导致最终页面上显示的列表不足5条,解决办法是附加一列,保证这一列是自增的并增加索引就可以了

性能优化之MySQL优化(慕课)的更多相关文章

  1. 网站优化之mysql优化

    一,网站优化之mysql优化:1.前缀索引,可以通过前缀去识别唯一性,把这个前缀作为索引内容,可以节省存储索引的空间,从而提高索引的查询速度.distinct 排重操作2,2.in条件索引使用同时查询 ...

  2. 性能优化之mysql优化——慢查日志的开启方式和存储

    -- MySQL优化 -- mysql 慢查日志的开启方式和存储 -- 1) 查看mysql是否开启慢查询日志 SHOW VARIABLES LIKE 'slow_query_log'; -- 2) ...

  3. 慕课网 性能优化之MySQL优化--- max 和count的性能优化

    注:在执行SQL语句前加上explain可以查看MySQL的执行计划 数据库:MySQL官方提供的sakila数据库 Max优化: 例如:查询最后支付时间 explain select max(pay ...

  4. mysql优化:慢查询分析、索引配置优化

    一.优化概述二.查询与索引优化分析a.性能瓶颈定位show命令慢查询日志explain分析查询profiling分析查询b.索引及查询优化三.配置优化 max_connections back_log ...

  5. MySQL优化具体

    1. 查询与索引优化分析 在优化MySQL时,通常需要对数据库进行分析,常见的分析手段有慢查询日志,profiling分析,EXPLAIN分析查询,以及show命令查询系统状态及系统变量,通过定位分析 ...

  6. Mysql优化之优化工具profiling

    程序员的成长之路 2016-11-23 22:42 Mysql优化之优化工具profiling 前言 mysql优化技术: mysql优化不是做一个操作就可以的优化,它包含很多的细节,需要一点一点的优 ...

  7. MySql优化相关概念的理解笔记

    MySQL架构 查询执行流程 查询执行的流程是怎样的: 连接1.1客户端发起一条Query请求,监听客户端的‘连接管理模块’接收请求1.2将请求转发到‘连接进/线程模块’1.3调用‘用户模块’来进行授 ...

  8. mysql 优化(包含sql语句的书写)

    http://blog.chinaunix.net/uid-11640640-id-3426908.html  mysql性能优化-慢查询分析.优化索引和配置 2012-11-30 15:18:42 ...

  9. 42 张图带你撸完 MySQL 优化

    Hey guys,这里是程序员cxuan,欢迎你阅读我最新一期的文章,这篇文章是 MySQL 调优的汇总版,我加了一下日常开发过程中的调优经验,希望对各位小伙伴们有所帮助.下面开始正文. 一般传统互联 ...

随机推荐

  1. 剑指Offer的学习笔记(C#篇)-- 树的子结构

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 一 . 二叉树的概念         树形结构是一种典型的非线性结构,除了用于表示相邻关系外,还可 ...

  2. 12.Python略有小成(生成器,推导式,内置函数,闭包)

    Python(生成器,推导式,内置函数,闭包) 一.生成器初始 生成器的本质就是迭代器,python社区中认为生成器与迭代器是一种 生成器与迭代器的唯一区别,生成器是我们自己用python代码构建成的 ...

  3. spring事物回滚机制 (事务异常回滚,捕获异常不抛出就不会回滚)

    当异常被捕获catch的时候,spring的事物则不会回滚 为什么不会滚呢??  spring aop  异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常 ...

  4. Ubuntu 最新设置阿里云更新源

    可将 http://cn.archive.ubuntu.com/ubuntu/ 替换为下列任意服务器: Ubuntu 官方(欧洲,国内较慢,无同步延迟) http://archive.ubuntu.c ...

  5. poj1185-炮兵阵地(状态压缩dp)

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25647   Accepted: 9892 Description ...

  6. MiniProfiler NET Core

    MiniProfiler 来分析 ASP.NET Core 应用 它会把结果直接放在页面的左下角,随时可以点击查看:这样的话就可以感知出你的程序运行的怎么样:同时这也意味着,在你开发新功能的同时,可以 ...

  7. 如何给数组用fill函数和memset函数给数组赋初值

    fill是按照单元来赋值的,所以可以填充一个区间的任意值 #include<iostream> #include<stdio.h> #include<string.h&g ...

  8. Codeforces Round #377 (Div. 2) D. Exams 贪心 + 简单模拟

    http://codeforces.com/contest/732/problem/D 这题我发现很多人用二分答案,但是是不用的. 我们统计一个数值all表示要准备考试的所有日子和.+m(这些时间用来 ...

  9. c# 类名不同,字段相同,如何快速给类赋值

    1,相关的两个类如下:现在我们知道短信的值,如何给微信来赋值呢,需要用到我们的反射,当然字段一一赋值也可以,但是如果字段有100个,这个方法就不行啦 /// <summary> /// 短 ...

  10. 微信支付(java版本)_支付结果通知

    应用场景: 支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答. 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新 ...