MySQL优化

这是个很大的坑,无法一下子写完,敬请期待 (溜
数据库优化可以从SQL及索引、数据库表结构、系统配置以及硬件这几个方面进行优化,优化成本及其效果见如下金字塔结构图。

优化效比图
优化效比图

下面我们以MySQL为例,介绍如何从这几个方面对数据库进行优化。

MySQL优化

慢查询

我们先使用下列命令查看系统慢查询配置

-- variables:系统变量
show variables  like 'slow_query_log'; -- 查看是否开启慢查询日志记录
show variables like 'log_queries_not_using_indexes'; -- 查看未使用索引的语句是否会记录在日志中
show variables like 'long_query_time'; -- 查看超过多长时间的查询会被记录
show variables like 'slow_query_log_file'; -- 查看日志存储位置

设置变量

-- global 系统全局变量
set global log_queries_not_using_indexes = on; -- 开启未使用索引的SQL记录
set global show_query_log = on; -- 开启慢查询日志记录

慢查询日志存储格式(5部分):

查询执行时间 # Time: 140712 8:33:29
执行SQL的主机信息 # User@Host: root[root]@localhost[]
SQL执行信息 # Query_time: 0.0005 Lock_time: 0.000...
SQL执行时间 SET timestamp=1405125209
SQL内容 show tables;

慢查询日志分析工具

1. mysqldumpshow
2. pt-query-digest
  # pt-query-digest /log/path/file.log | more

优化的问题点

  • 查询次数多且每次查询占用时间长的SQL(通常为pt-query-digest分析的前几个查询)
  • IO大的SQL(注意pt-query-digest分析中的ROWS EXAMINE项)( * <font color=red>数据库中最主要的瓶颈就处在IO</font> *)
  • 未命中索引的SQL(注意pt-query-digest分析中ROWS EXAMINE和ROWS SEND的对比)(* <font color=red>SQL扫描行数越多,IO消耗越大</font> *)

优化

分析SQL查询

使用explain查询SQL的执行计划(* <font color=red>数据库中SQL都需先进行执行计划分析,然后再进行具体查询</font> *)
我们使用ssm_book表来做演示,ssm_book表结构如下:

create table ssm_book(
    id int auto_increment primary key, -- ID
    isbn varchar(15) not null, -- 图书ISBN(国际标准书号)编号
    path varchar(150) default '' null, -- 封面路径
    title varchar(200) default '' null, -- 书名
    subtitle varchar(200) default '' null, -- 副标题
    original_title varchar(200) default '' null, -- 原名称
    market_price varchar(10) default '' null, -- 市场价
    intro text null, -- 介绍
    binding varchar(20) default '' null, -- 装订类型
    pages varchar(10) null, -- 页数
    author varchar(200) null, -- 作者
    publisher varchar(100) null, -- 出版商
    catalog text null, -- 目录
    supply varchar(20) null, -- 库存
    status int default '0' null, -- 发布状态
    hot int default '0' null -- 热度
);

数据文件点击下载。

先执行一个简单的SQL,看看其执行计划:

select id, isbn, title from ssm_book;

得到执行计划如图:


表扫描执行计划
表扫描执行计划

各字段意义如下表:

字段名 意义
table 显示这一行的数据是关于哪张表的
type 这是最重要的列,显示链接使用了何种类型。从最好到最差的连接类型为const, eq_reg, ref, range, index和ALL
possible_keys 显示可能应用在这张表中的索引。如果为空,则没有可用的索引
key 实际使用的索引。如果为空,则没有使用索引
key_len 使用的索引的长度。在不损失精度的情况下,长度越短越好
ref 显示索引的哪一列被使用了。如果可能的话,最好为一个常数
rows MySQL认为必须检查的用来返回请求数据的行数
extra 扩展列。下面表格介绍。

extra(扩展列介绍)

意义
using filesort 使用文件排序。看到这个值说明查询需要优化。MySQL需要进行额外的步骤来发现如何对返回行排序。它根据连接类型以及存储排序键值和匹配条件的全部行指针来排序全部行
using temporary 使用临时表。看到这个值说明查询需要优化。这里,MySQL需创建一个临时表来存储结果。这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上

特例优化

  • count()和max()函数的优化方法
    eg: 查询ISBN最大的数据 -- 优化max()函数
selece max(isbn) from ssm_book;

SQL的执行计划如图:


max执行计划
max执行计划

可以看到执行这条SQL我们会进行表扫描。
优化的方案通常为在max()函数的键上建立索引。

create index idx_isbn on ssm_book(isbn);

这样,我们的执行计划将变成下图所示:

max索引优化执行计划
max索引优化执行计划

这样,我们仅通过索引就能得到结果。 * 索引是顺序排列的,max()函数只需取最后一个就好了 *
eg: 在一条语句中同时查询出中国出版和美国出版的书的数量。 -- count()函数优化

-- ISBN号以978-0 978-1开头的书籍为美国出版,以978-7开头的书籍为中国大陆出版
select count(isbn) from ssm_book where isbn like '9787%' or isbn like '9780%' or isbn like '9781%'; 

这样的一条SQL并不能达到我们的目的,我们可以使用下面的语句来进行查询:

select count(isbn like "9787%" or NULL) as "中国出版", count(isbn like "9780%" or isbn like "9781%" or NULL) as "美国出版" from ssm_book;

执行计划如下图:


count执行计划
count执行计划

如图,该SQL达到了我们大要求,而且没有使用表扫描。

  • 子查询优化
    通常情况下,对子查询的优化为,将子查询优化为join查询,但在优化时需要注意关联键是否存在一对多的关系,需要注意重复数据(用distinct()函数去重)。

  • group by查询的优化

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

该SQL可以使用子查询进行优化:

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

在该SQL优化中,我们使用了子查询先对数据进行过滤,从而达到优化目的。由此可见,SQL的优化并没有统一优化方案,需要具体情况具体分析。

  • limit查询优化
    limit常用语分页处理,时常会伴随着order by从句使用,因此大多时候会使用filesort,这样会造成大量的IO问题。
SELECT id, isbn, title from ssm_book ORDER BY title ASC LIMIT 0, 10;

该SQL将进行表扫描并且使用文件排序,执行计划如图:


limit执行计划
limit执行计划

下面介绍优化方案:
步骤1:
使用有索引的列或主键进行order by操作。

-- 这里我们就不为title添加索引了,我们使用ISBN进行模拟测试
select id, isbn, title from ssm_book ORDER BY isbn asc LIMIT 0, 10;

该SQL执行计划如图所示:


limit索引执行计划
limit索引执行计划

比较其执行计划,第一条SQL使用表扫描同事使用文件排序,而第二个语句使用索引查询,而且扫描行数仅为10行。

步骤2:
第二个SQL的扫描行数为10?是不是觉得很奇怪?这里,扫面函数为10行是因为SQL的limit取的是前10行。于是就会发现问题,LIMIT取越后面的行的数剧扫描的行数也就越多,那就是说取越后面的数据SQL执行效率也就越慢。
解决的办法就是:记录上次返回的主键,在下次查询时使用主键过滤。

select id, isbn, title from ssm_book where id >= 1000 and id <=1009 ORDER BY id desc limit 0, 10;

执行计划如图:


limit执行计划
limit执行计划

这样的话SQL扫描的行数就永远是10行了,而且连接类型也为比index更优的range,缺点是列必须为顺序且中间无间断,否则将取不到10条数据。


未完待续

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 系统层面(基本不用动,看了下,买的云服务器基本都已经优化过了) 内核相关参数(/etc/sysctl.conf) ...
    神奇大叶子阅读 1,994评论 0 4
  • 网上关于SQL优化的教程很多,都是从理论或者实际操作经验直接入手,今天我将已实际项目过程为主线来谈一谈MySql的...
    YingxiangEmpire阅读 469评论 0 2
  • Mysql数据库的优化技术 对mysql优化时一个综合性的技术,主要包括 a:表的设计合理化(符合3NF) b:添...
    烈焰焚烧阅读 449评论 0 2
  • 之前的文章一直在规避索引的建立去优化数据库,不是不想讲,而是这个太重要,必须抽出来讲。今天我们就来研究下数据库索引...
    JackFrost_fuzhu阅读 4,713评论 0 70
  • 人总是有性格弱点的,我性格比较内向,有一些典型的问题,比如 害怕“挑战” 比如说畏惧,胆小,好面子,一些东西明明没...
    riveraiyanzi阅读 401评论 0 0