一、慢查询

1、慢查询日志

是指 mysql 记录所有执行超过long_query_time参数设定的时间阈值的 SQL 语句的日志。

2、慢查询配置

# 默认 10 秒,这里为了演示方便设置为 0
set global long_query_time=0;
#W开启慢查询日志
set GLOBAL slow_query_log = 1;
# 项目开发中日志只能记录在日志文件中,不能记表中
set global log_output='FILE,TABLE'
# 查看慢查询日志信息
cat /usr/local/mysql/data/mysql-slow.log

3、慢查询日志解析

  • 第一行:用户名 、用户的 IP 信息、线程 ID 号
  • 第二行:执行花费的时间【单位:毫秒】
  • 第三行:执行获得锁的时间
  • 第四行:获得的结果行数
  • 第五行:扫描的数据行数
  • 第六行:这 SQL 执行的具体时间
  • 第七行:具体的 SQL 语句

4、慢查询分析

慢查询的日志记录非常多,要从里面找寻一条查询慢的日志并不是很容易的事情,一般来说都需要一些工具辅助才能快速定位到需要优化的 SQL 语句。

4.1Mysqldumpshow

mysqldumpshow -s r -t 10 slow-mysql.log-s order (c,t,l,r,at,al,ar)
c:总次数
t:总时间
l:锁的时间
r:总数据行
at,al,ar :t,l,r 平均数 【例如:at = 总时间/总次数】
-t top 指定取前面几条作为结果输出
# 按照时间排序,取出前10条记录
mysqldumpslow -s t -t 10 /usr/local/mysql/data/mysql-slow.log

二、索引

1、mysql索引B+tree

1.1定义

  • 数据只存储在叶子节点上,非叶子节点只保存索引信息;
    ◦ 非叶子节点(索引节点)存储的只是一个 Flag,不保存实际数据记录;
    ◦ 索引节点指示该节点的左子树比这个 Flag 小,而右子树大于等于这个 Flag
  • 叶子节点本身按照数据的升序排序进行链接(串联起来);
    ◦ 叶子节点中的数据在 物理存储上是无序 的,仅仅是在 逻辑上有序 (通过指针串在一起);

1.2 作用

  • 在块设备上,通过B+树可以有效的存储数据;
  • 所有记录都存储在叶子节点上,非叶子(non-leaf)存储索引(keys)信息;
  • B+树含有非常高的扇出(fanout),通常超过100,在查找一个记录时,可以有效的减少IO操作;

1.3B+tree操作

B+tree操作

2、索引分类

  • 普通索引:即一个索引只包含单个列,一个表可以有多个单列索引
  • 唯一索引:索引列的值必须唯一,但允许有空值 复合索引:即一个索引包含多个列
  • 聚簇索引(聚集索引):并不是一种单独的索引类型,而是一种数据存储方式。具体细节取决 于不同的实现,InnoDB 的聚簇索引其实就是在同一个结构中保存了 B-Tree 索引(技术上来说 是B+Tree)和数据行。
  • 非聚簇索引:不是聚簇索引,就是非聚簇索引
# 查看索引
SHOW INDEX FROM table_name\G
# 创建索引
CREATE [UNIQUE ] INDEX indexName ON mytable(columnname(length));
ALTER TABLE 表名 ADD [UNIQUE ] INDEX [indexName] ON (columnname(length))
# 删除索引
DROP INDEX [indexName] ON mytable;

三、执行计划

使用 EXPLAIN 关键字可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是 如何处理你的 SQL 语句的。分析你的查询语句或是表结构的性能瓶颈。

1、执行计划详解



四、sql优化

1、尽量全值匹配

当建立了索引列后,能在 wherel 条件中使用索引的尽量所用。

2、最佳坐前缀原则法则

如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。

3、不在索引列上做任何操作

不在索引列上做任何操作(计算、函数、(自动 or 手动)类型转换),会导致索引失效而转向 全表扫描

4、范围条件放最后

中间有范围查询会导致后面的索引列全部失效

5、覆盖索引尽量用

6不等于要甚用

mysql 在使用不等于(!= 或者<>)的时候无法使用索引会导致全表扫描,如果定要需要使用不等于,请用覆盖索引

7、Null/Not 有影响

  • 在字段为 not null 的情况下,使用 is null 或 is not null 会导致索引失效
  • 自定义为NULL或者不定义,Is not null 的情况会导致索引失效

解决方式:覆盖索引

8Like 查询要当心

like 以通配符开头(’%abc…’)mysql 索引失效会变成全表扫描的操作

解决方式:覆盖索引
EXPLAIN select name,age,pos from staffs where name like ‘%july%’

9、字符类型加引号

字符串不加单引号索引失效

10、OR改UNION效率高

# 索引失效
EXPLAIN
select * from staffs where name='July' or name = 'z3'EXPLAIN
select * from staffs where name='July' UNION
select * from staffs where name = 'z3'

解决方式:覆盖索引

EXPLAIN
select name,age from staffs where name='July' or name = 'z3'

解决方式:覆盖索引

EXPLAIN
select name,age from staffs where name='July' or name = 'z3'

记忆总结:

  • 全职匹配我最爱,最左前缀要遵守;
  • 带头大哥不能死,中间兄弟不能断;  索引列上少计算,范围之后全失效;
  • LIKE百分写最右,覆盖索引不写*;
  • 不等空值还有OR,索引影响要注意;
  • VAR 引号不可丢, SQL 优化有诀窍。

五、批量导入

LOAD DATA INFLIE
使用 LOAD DATA INFLIE ,比一般的 insert 语句快 20 倍

// 将product_info数据导出
select * into OUTFILE 'D:\\product.txt' from product_info
// 导入到product_info2中
load data INFILE 'D:\\product.txt' into table product_info2
load data INFILE '/soft/product3.txt' into table product_info2

200万条数据,17s

show VARIABLES like 'secure_file_priv'
  • secure_file_priv 为 NULL 时,表示限制 mysqld 不允许导入或导出。
  • secure_file_priv 为 /tmp 时,表示限制 mysqld 只能在/tmp 目录中执行导入导出,其他目录不能执行。
  • secure_file_priv没有值时,表示不限制mysqld在任意目录的导入导出。

六、mysql性能优化相关推荐

  1. Mysql性能优化方案

    2019独角兽企业重金招聘Python工程师标准>>> 内容简介:这是一篇关于mysql 性能优化的文章.网上有不少mysql 性能优化方案,不过,mysql的优化同sql serv ...

  2. MySQL 性能优化,优化设计及设计原则解读

    MySQL性能优化的目的 如何合理的设计数据库? 什么样的数据库设计才能给后期DBA优化提供基石? 数据库设计与程序设计的差异? 数据库设计早期优化 1. 关系明确(理清表之间的关系,可以通过冗余的方 ...

  3. MySQL 性能优化技巧

    原文地址:MySQL 性能优化技巧 博客地址:www.extlight.com 一.背景 最近公司项目添加新功能,上线后发现有些功能的列表查询时间很久.原因是新功能用到旧功能的接口,而这些旧接口的 S ...

  4. MySQL性能优化点记录

    第一章 myisam,可以基于blob和text的前500字节,创建索引 myisam 支持fulltext 延迟更新索引 (delay_key_write) CREATE TABLE `table3 ...

  5. Mysql 性能优化——必胜之道

    mysql的性能优化是运维和DBA们常常面对的问题,也是各大公司招聘人才时看中的要点之一.性能优化听上去很难,似乎只有大神才能做,然而,mysql的性能优化绝不是运维独自一个能完成的,DBA.开发.架 ...

  6. mysql 性能优化方案

    网 上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

  7. MySQL性能优化(七):其它优化

    一:数据库配置优化 mysql是一个高度定制化的数据库系统,提供了很多配置参数,一般都需要根据应用程序的特性和硬件情况对mysql做配置优化,windows配置文件为my.ini,linux为my.c ...

  8. 性能优化专题 - MySql 性能优化 - 04 - MySql调优

    目录导航 前言 Undo-log与Redo-log 案例 当前读.快照读 Redo Log的落盘配置 MySQL配置优化 MySQL服务器参数类型 快速定位MySql配置文件 MySQL内存参数配置 ...

  9. mysql半连接_mysql表的半连接,反连接导致的mysql性能优化剖析

    [导读] 关于Oracle的半连接,反连接,我一直认为这是一个能讲很长时间的话题,所以在我的新书<Oracle DBA工作笔记>中讲性能优化的时候,我花... 关于Oracle的半连接,反 ...

  10. 记一次mysql性能优化过程

    2019独角兽企业重金招聘Python工程师标准>>> 转发自:记一次mysql性能优化过程 由于配置是运行过那么长时间,很稳定,基本上不考虑,所以本次主要是sql的优化,并且集中在 ...

最新文章

  1. MYSQL || 的BUG // MYSQL 不同库自增id的问题 //MySQL根据表注释查找对应的表 //hive -mysql 日期比较
  2. 大数据征信应用与启示 ——以美国互联网金融公司 ZestFinance为例
  3. 6-Qt6对象树及内存管理
  4. 一张截图,告诉你字节跳动的 Java 开发能力到底有多强...
  5. 各大公司java面试整理对应问题博客整理
  6. Java 网络编程1
  7. java设计模式之装饰模式_Java中的装饰器设计模式
  8. 协助你写 Python,只是 AI 取代程序员的第一步
  9. 手把手叫你玩转网络编程系列之三 完成端口(Completion Port)详解
  10. String split分隔符总结
  11. mysql oracle replay_Oracle 数据库重放(Database Replay)功能演示
  12. Element-UI省市区(县)三级联动---基于VUX移动框架的x-address组件
  13. RJ45墙上网线插座的线序与接法
  14. matlab和r语言做热图,R语言画图与MATLAB画图PK
  15. “跨综服”——跨境电商综合服务合规化走向台前
  16. iOS开发 适配iPhone XS Max/iPhone XR
  17. 关于哔哩哔哩视频,音频合并(使用ffmpeg批量处理)
  18. 对数数学知识回忆(log)
  19. c语言规定的主函数名是,C语言源程序中主函数名由系统规定为_______,程序员是不能改变的。...
  20. 《中英双解》leetCode Arranging Coins (排列硬币)

热门文章

  1. SAP系统资产盘盈盘亏的处理
  2. 删除自定义reg注册表
  3. 或非门sr锁存器_sr锁存器的工作原理
  4. Excel:单元格提取数字,并求和
  5. Python数据可视化(微课版)-简介
  6. html文本转成二进制,肿么把文本文件转换成二进制bin文件
  7. RuntimeError: mat1 and mat2 shapes cannot be multiplied (192x64 and 4x3)
  8. pathon包傻瓜升级
  9. opencv图像处理学习
  10. php网站整合ck播放器,帝国cms整合CKplayer播放器代码教程