MySQL 性能优化

MYSQL优化.png

本文是对于sqlercn在慕课上发表的“MySQL 性能优化”课程的学习笔记,内容并非原创。

前言

MYSQL性能优化主要包含三种方法:

  1. 查询优化
  2. 表结构优化
  3. 系统优化
    大部分的性能问题能通过查询优化解决,其次是表结构优化,最后才是系统优化。因此查询优化也会占据大量的篇幅。

查询优化

慢查询日志

如何开启慢查询:

mysql> show variables like 'slow_query_log'
mysql> set global slow_query_log = ON;
mysql> set global slow_query_log_file='D:/download/mysql-8.0.19-winx64/mysql-8.0.19-winx64/mysql-slow.log';
mysql> set global log_queries_not_using_indexes=on;
mysql> set global long_query_time=1;   //超过1s的查询都会被记入慢查询日志
TCP Port: 3306, Named Pipe: MySQL
Time                 Id Command    Argument
# Time: 2020-02-15T08:21:23.220194Z
# User@Host: root[root] @ localhost [::1]  Id:    13
# Query_time: 0.001607  Lock_time: 0.000536 Rows_sent: 599  Rows_examined: 599
use sakila;
SET timestamp=1581754883;
select * from customer;

可以使用一些工具来分析慢查询:
1.mysqldumpslow
2.pt-quary-slow
其中mysqldumpslow是mysql自带的分析工具,可以汇总慢查询记录并进行排序

mysqldumpslow you-slow-log.log ##对you-slow-log.log进行分析

而pt-quary-slow能分析出更多的统计信息

哪些慢查询需要引起关注

  1. 查询次数多且用时长
  2. IO大的SQL
  3. 没有使用索引的SQL

explain

mysql> explain select * from customer ;
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | customer | NULL       | ALL  | NULL          | NULL | NULL    | NULL |  599 |   100.00 | NULL  |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+

table: 显示这行数据是关于哪张表

type: 显示连接使用了什么类型,包含:const,eq_reg,ref,range,index,all
const->当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量(where上用到唯一索引或默认索引)

select * from table where id  = 1;

eq_reg->类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件
ref->基于索引的查找

select * from table where catalog  = 1;

range->基于索引的范围查找

select * from table where catalog  > 1;

index->对于索引的扫描

select catalog   from table;

all->全表扫描

select * from table;

possible_keys:可能使用的索引
key:实际使用的索引
key_len:使用索引的长度(理论上越短越好)
ref:列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
rows:mysql认为必须检查的用来返回请求的行数
extra:
using filesort,using temporary。尽量优化!

索引优化

  1. 在需要索引的地方加上索引,并保证索引能被MYSQL正常使用上
  2. 在满足使用的情况下,索引要尽可能的小
  3. 对于联合索引,离散度高的索引加在前,离散度低的加在后
  4. 减少重复,冗余和不使用的索引

合适的数据类型

  1. 最小的数据类型
  2. 最简单的数据类型
  3. 少用null
  4. 少用text,如果要使用,将它提出到另一张附加表中

三大范式

  1. 所有列不可拆分
  2. 别的列必须依赖与主键而不能只依赖主键的一部分
  3. 别的列必须直接依赖主键,而不能间接依赖主键

反范式

用一些冗余的数据来达到减少查询开销的目的,空间换时间

垂直拆分

根据表的字段进行拆分,比如一个表中字段很多,其中有一部分字段很少被用到,有一部分字段经常被用到,还有一部分字段是text或很大的数据结构,那么我们可以将它们根据这三种特点进行拆分

水平拆分

如果表的数据太多,则可以将数据分配到多张表中。使用hash的方法对id进行索引,同时表可以分为业务表和统计表。业务表指平时程序调用的表,对业务表采用水平拆分达到性能的提升,而对统计表,由于被用到的次数比较少,同时又会设计到表中大部分的数据,因此选择不对其进行拆分,避免使用join。
业务表和统计表同时存在,

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

推荐阅读更多精彩内容

  • 转自: https://www.bbsmax.com/A/6pdDv0aqJw/ 使用ThinkPHP开发中MyS...
    WangLu_Work阅读 290评论 0 2
  • 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才...
    Java小铺阅读 292评论 0 1
  • 原文地址:https://www.cnblogs.com/huchong/p/10219318.html 数据库命...
    meiyou_6652阅读 493评论 0 0
  • 今天我们课上讨论人呀!有一个讨论的问题是罗高是一个什么样的首领与瑞夏德救罗高有什么风险? 我觉得罗高是一个非常不错...
    平靖溥妈妈阅读 512评论 0 0
  • 他是留守儿童,从小父母不在身边,他跟着爷爷奶奶长大。 他虽然头脑很聪明,但由于是早生儿,体质偏弱,个头小,而且身材...
    雪莲静语阅读 220评论 0 2