MySQL从入门到高级 --- 15.优化 && 16.pymysql

第十五章 && 第十六章:

15.优化

优化方式

  • 从设计上

  • 从查询上

  • 从索引上

  • 从存储上

15.1 查询SQL执行效率

语法:show [session | global |] status

  • 查看服务器状态信息

在这里插入图片描述

参数 意义
Com_select 执行select操作数次,一次查询只累加1
Com_insert 执行insert操作数次,对批量插入的insert操作,只累加1次
Com_update 执行update操作数次
Com_delete 执行delete操作数次
Innodb_rows_read select查询返回的行数
Innodb_rows_inserted 执行insert操作插入的行数
Innodb_rows_updated 执行update操作更新的行数
Innodb_rows_deleted 执行delete操作删除的行数
Connections 试图连接MySQL服务器的次数
Uptime 服务器工作时间
Slow_queries 慢查询的次数
15.2 定位低效率执行SQL

两种方式

  • 慢查询日志:定位执行效率较低的SQL语句

  • show processlist:该指令查看当前MySQL在进行的线程,包括线程的状态、是否锁表等,可实时查看SQL执行情况,同时对一些锁表操作进行优化

在这里插入图片描述

15.2.1 show processlist

在这里插入图片描述

  1. id:用户登录mysqld时,系统分配的"connection_id",可用函数connection_id()查询

  2. user:显示当前用户。若不是root,该命令只显示用户权限范围的SQL语句

  3. host:显示语句从哪个ip端口上发的,可用来跟踪出现问题语句的用户

  4. db:显示进程目前连接的数据库

  5. command:显示当前连接执行的命令,一般取值为休眠(sleep),查询(query),连接(connect)等

  6. time:显示状态持续的时间,单位是秒

  7. state:显示使用当前连接的SQL语句状态。描述的是语句执行中的某一个状态

  8. info:显示SQl语句,判断问题语句的重要依据

15.3 explain分析执行计划 - 基本使用

在这里插入图片描述

  • id:序列号,查询中执行select子句或者是操作表的顺序

  • select_type:SELECT的类型

  • table:输出结果集的表

  • type:表的连接类型

  • possible_keys:查询时,可能使用的索引

  • key:实际使用的索引

  • key_len:索引字段的长度

  • rows:扫描行的数量

  • extra:执行情况的说明和描述

15.4 explain分析执行计划 - id
  • 相同id表示加载表的顺序是从上到下

  • 不同id值越大,优先级越高,越先被执行

  • id有相同,也有不同,同时存在。id相同可认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先被执行

15.5 explain分析执行计划 - select_type
  • 表示SELECT类型
select_type 意义
SIMPLE select查询,查询中不包含子查询或UNION
PRIMARY 查询中包含任何复杂的子查询,最外层查询标记为该标识
SUBQUERY SELECT或WHERE列表中包含了子查询
DERIVED FROM列表中包含的子查询,被标记为DERIVED,MySQL会递归执行子查询,将结果放入临时表中
UNION 若第二个SELECT出现在UNION后,则标记为UNION;若UNION包含在FROM子句的子查询中,外层SELECT将被标记DERIVED
UNION RESULT UNION表获取结果的SELECT
15.6 explain分析执行计划 - type
  • 显示访问类型
type 意义
NULL 不访问任何表,索引,直接返回结果
system 系统表,少量数据,通常不需要进行磁盘IO
const 命中主键或唯一索引
eq_ref 对于前表的每一行,后表只有一行被扫描
ref 非唯一性索引扫描,返回匹配某个单独值的所有行
range 只检索给定返回的行,使用一个索引来选择行
index 需要扫描索引上的全部数据
all 全表扫描,此时id上无索引

结果值从最好到最坏:system->const->eq_ref->ref->range->index->all

15.7 explain分析执行计划 -其他指标字段
  • table:显示所访问数据库中表名称有时不是真实的表名字,可能是简称

  • rows:扫描行的数量

  • possible_keys:显示可能应用在该表的索引,一个或多个

  • key:实际使用的索引,若为NULL,则没有使用索引

  • key_len:索引中使用的字节数,该值为索引字段最大可能长度,不是实际使用长度,在不损失精度的情况下,长度越短越好

  • extra:

extra 意义
using filesort 说明数据库会对数据使用一个外部的索引排序,不按照表内的索引顺序进行读取,效率较低
using temporary 需建立临时表来暂存中间结果,效率较低
using index SQL所需返回的所有列数据均在一颗索引树上,避免访问表的数据行,效率可观
15.8 show profile分析SQL

通过have_profiling参数,可看到当前MySQL是否支持profile

select @@have_profiling;
set profiling=1 -- 开启profiling开关

show profile for query query_id 可查看到该SQL执行过程中每个线程的状态和消耗时间

在这里插入图片描述

15.9 trace分析优化器执行计划
set optimizer_trace="enabled=on",end_markers_in_json=on;
set optimizer_trace_max_mem_size=1000000;

  • 打开trace,设置格式为json,并设置trace最大能用的内存大小,避免解析过程中默认内存太小而不能完整展示

通过information_schema.optimizer_trace可知道MySQL如何执行SQL

-- 执行SQL
select * from emp;
select * from information_schema.optimizer_trace \G;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

15.10 使用索引优化
15.10.1 数据
create table stu(
    id int,
    name varchar(20),
    age int,
    sex varchar(20),
    address varchar(20),
    primary key(id)
);

insert into stu values(1,'xiaoming',19,'男','北京');
insert into stu values(2,'xiaowang',25,'女','深圳');
insert into stu v
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值