mysql执行计划

Mysql优化

帅比萌擦擦* 提交于 2020-01-28 04:42:12
一、Mysql的逻辑架构 二、存储引擎 Mysql5.5之前,默认存储引擎是MyISAM,5.5之后默认存储引擎变成 InnoDB 。 MyISAM和InnoDB的区别: 1)MyISAM不支持事务、InnoDB支持事务 2)MyISAM只有表锁、InnoDB引入了行锁 3)MyISAM支持全文索引、InnoDB 5.5不支持,5.6以后支持 4)MyISAM的读写速度会优于InnoDB 三、MySQL优化(SQL优化) · 数据类型的优化(创建表的时候,选择合适的数据类型) · 索引优化(SQL优化成本最低并且最有效果的优化方式) · 查询优化(SQL自带的检测工具、SQL结构) · 库表结构优化(分库分表、读写分离) · 硬件优化(cpu、固态硬盘、内存) · 参数优化(系统运行参数)- DBA 四、数据类型的优化 数据类型的选择原则: · 选择最小的数据类型,同时需要保证能够放下所存储的数据 · 选择最合适的数据类型,比如使用int表示年龄,而是不是varchar表示年龄 · 尽量让需要添加索引的列为not null 五、索引优化 什么是索引? 索引是一本书的目录,可以快速找到相应的内容。 索引是一个帮助我们快速查询内容的 数据结构 。   无索引的查询方式: 有索引的查询方式: 索引失效: 当写了一个索引后,开发者认为执行的sql会用上该索引

MySQL 索引深入剖析

点点圈 提交于 2020-01-27 19:02:41
1. 索引是什么? 1.1. 索引是什么 一张表有 500 万条数据,在没有索引的 name 字段上执行一条 where 查询: select * from user_innodb where name = ' 青山 ' ; 如果 name 字段上面有索引呢?在 name 字段上面创建一个索引,再来执行一下相 同的查询。 ALTER TABLE user_innodb DROP INDEX idx_name; ALTER TABLE user_innodb ADD INDEX idx_name (name); 有索引的查询和没有索引的查询相比,效率相差几十倍。 通过这个案例大家应该可以非常直观地感受到,索引对于数据检索的性能改善是非 常大的。 那么索引到底是什么呢?为什么可以对我们的查询产生这么大的影响?创建索引的 时候发生了什么事情? 1.1.1.索引定义 维基百科对数据库索引的定义: 数据库索引,是数据库管理系统(DBMS)中一个排序的数据结构,以协助快速查询、更新数据库表中数据。 数据是以文件的形式存放在磁盘上面的,每一行数据都有它的磁盘地址。如果没有 索引的话,我们要从 500 万行数据里面检索一条数据,只能依次遍历这张表的全部数据, 直到找到这条数据。 但是我们有了索引之后,只需要在索引里面去检索这条数据就行了,因为它是一种 特殊的专门用来快速检索的数据结构

Mysql调优-explain的使用

我的梦境 提交于 2020-01-27 18:55:08
Mysql-expalin的使用 explain简介 explain输出列解释 explain输出列-id explain输出列-select_type explain输出列-type explain输出列-possiable_keys、key explain输出列-key_len explain输出列-ref explain输出列-rows explain输出列-extra 参考博客 explain简介 explain和SQL语句一起使用的时候,MySQL将显示来自优化器的相关语句执行计划的信息,包括表的读取顺序、数据读取操作的操作类型、那些索引可以被使用、那些索引会被实际使用、表之间的引用、每张表大概需要读取多少行记录等等。通过这些我们能分析SQL语句的结构和性能瓶颈,从而优化我们的SQL语句。 example: explain输出列解释 字段 字段说明 字段值描述 id select查询序列号,包含一组数字,表示查询中执行select子句或者操作表的顺序 id相同 执行顺序由上至下 id不相同 如果是子查询,id的序号会递增,id的值越大被执行的优先级越高 id相同和不相同都存在 如果id相同可以认为是一组,同一组id执行顺序由上至下,不同组之间,id值越大被执行的优先级越高 select_type 查询的类型,主要用来区别普通查询,联合查询,子查询等复杂查询 SIMPLE

MySQL执行计划

荒凉一梦 提交于 2020-01-27 05:24:23
想了解mysql性能优化,首先要学会使用查看执行计划,执行计划主要用来查看SQL语句在数据库中的表现情况,通常用于SQL性能分析,SQL优化等 创建执行计划的语句有两种,如下所示 desc select * from table_test where table_test.id = 1; explain select * from table_test where table_test.id = 1; # desc 和 explain 两个关键字都可以用来查看SQL执行计划 压力测试准备 创建表: CREATE TABLE IF NOT EXISTS temp_100w( id int not null DEFAULT 0 COMMENT "学号", name VARCHAR(100) not null DEFAULT '未知' COMMENT "姓名", age TINYINT(10) not null DEFAULT 99 comment "年龄", sex ENUM('boy','girl','secret') DEFAULT 'secret' COMMENT '性别', create_time TIMESTAMP NOT NULL default NOW() comment '软删除标记' )engine=INNODB DEFAULT CHARSET utf8; #

MySQL 性能调优之查询优化

烈酒焚心 提交于 2020-01-26 14:12:13
性能调优相关文档书籍 http://dev.mysql.com/doc/refman/5.7/en/group-by-optimization.html http://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html 《MySQL性能调优与架构设计》 SQL查询优化总结 缺失索引,查询速度差别是100倍:首先应考虑在 where 及 order by 涉及的列上建立索引 1 show index from mb_ransomrequestform; 2 ALTER TABLE mb_ransomrequestform ADD INDEX IDX_corporationid (corporationid); 3 drop index IDX_corporationid on mb_ransomrequestform; View Code 避免在 where 子句使用不能使用索引的操作符,比如!=、<>、like “%xx%”、or。否则将导致引擎放弃使用索引而进行全表扫描。 1)like “%xx%”改成like “xxx%”可以使用索引 mysql> select bill.billId from EE_PawnBill bill, EE_PawnerInfo pawner where bill.pawnerid

MySQL information_schema表查询导致内存暴涨

冷暖自知 提交于 2020-01-26 13:54:15
case:下面的一条sql语句,导致mysql实例内存暴涨:    select * from tables where table_name not in(select table_name from partitions group by table_name having count(*)>1 );    mysql 5.5, 1w+的innodb表。 下面看下调查的结果: 1. sql的执行情况以及内存分配: step1 : 构造information_schema.tables临时表 1.1 构造临时表tables结构: 说明:func=create_schema_table; engine=heap 内存: tables是heap引擎的表,临时构造,使用堆内存;语句结束close_tmp_tables释放。 1.2 填充临时表tables数据:一共由三类表来填充tables的内存 1. memory 引擎: 说明:information_schema下的表,创建临时table, 内存: 使用堆内存,填充完数据后 close_tmp_tables,释放内存。 2. mysiam 引擎: 说明:information_schema下一部分表,是mysiam引擎的临时表。 内存: 使用堆内存,创建磁盘临时文件,close_tmp_tables,释放内存,删除临时文件。 3.

Mysql 层级、执行顺序、执行计划分析

一笑奈何 提交于 2020-01-26 13:25:04
逻辑分层 下面是MySQL的逻辑分层图: 连接层:连接与线程处理,这一层并不是MySQL独有,一般的基于C/S架构的都有类似组件,比如连接处理、授权认证、安全等。 服务层:包括缓存查询、解析器、优化器,这一部分是MySQL核心功能,包括解析、优化SQL语句,查询缓存目录,内置函数(日期、时间、加密等函数)的实现。 引擎层:负责数据存储,存储引擎的不同,存储方式、数据格式、提取方式等都不相同,这一部分也是很大影响数据存储与提取的性能的;对存储层的抽象。 存储层:存储数据,文件系统。 存储引擎 查看数据库支持的存储引擎:show engines; 如果要想查看数据库默认使用哪个引擎,可以通过使用命令: show variables like '%storage_engine%'; InnoDB,MyISAM的主要区别: InnoDB:在MySQL5.5开始作为默认的存储引擎,支持事务,行级锁,适合高并发场景,XA协议支持分布式事务, 事务优先 。 MyISAM:不支持事务, 性能优先 ,表级锁,不适合高并发场景。 sql执行顺序: https://www.cnblogs.com/annsshadow/p/5037667.html explain-执行计划 explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 使用方法

一次浴火重生的MySQL优化(EXPLAIN命令详解)

给你一囗甜甜゛ 提交于 2020-01-26 13:21:21
一直对SQL优化的技能心存无限的向往,之前面试的时候有很多面试官都会来一句,你会优化吗?我说我不太会,这时可能很多人就会有点儿说法了,比如会说不要使用通配符*去检索表、给常常使用的列建立索引、还有创建表的时候注意选择更优的数据类型去存储数据等等,我只能说那些都是常识,作为开发人员是必须要知道的。但真正的优化并不是使用那些简单的手法去完成实现的,要想知道一条SQL语句执行效率低的原因,我们可以借助MySQL的一大神器---"EXPLAIN命令",EXPLAIN命令是查询性能优化不可缺少的一部分,本文在结合实例的同时会总结explain命令的使用及相关参数的说明。 首先说说我这次浴火重生的优化初衷吧,上个月在公司完成的统计模块中,其中就有几条SQL语句执行的速度稍微有点慢,心里一直留了一道坎。直到昨天晚上在家看了一篇文章,是关于MySQL优化的对EXPLAIN命令的详解,所以今天一到公司就想着把之前那些SQL语句的病赶紧给看看,虽然,我没有达到那种秒查的效果,但是优化的效果还是有明显的提升。 业务场景: 分区 统计XXX省 每月 上传数据的企业数量,何为企业是否是未上传数据,即专门存放上传数据的数据表中没有记录的为未上传数据的企业,如果有那么代表已经上传数据。 下面是我之前写的SQL语句(未优化前的),它执行的时间是 2.318sec ,并且使用EXPLAIN命令进行分析:

Sharding-Proxy 源码分析

北城余情 提交于 2020-01-26 09:33:39
目录 Sharding-Proxy 源码分析 Sharding-Proxy 包结构 Sharding-Proxy 启动流程 Sharding-Proxy 请求接入 MySQL 报文解析器 MySQL 执行器 MySQLComQueryPacketExecutor 执行流程 MySQLComStmtExecuteExecutor 执行流程 Sharding-Proxy 消息处理 Sharding-Proxy 源码分析 在看 Sharding-Proxy 源码之前,强烈建议先阅读一直官网的两篇文章: Apache Sharding-Proxy 使用手册 Apache Sharding-Proxy 设计原理 Sharding-Proxy 包结构 sharding-proxy ├── sharding-proxy-backend 负责与底层mysql通信 ├── sharding-proxy-bootstrap 启动sharding-proxy ├── sharding-proxy-common yaml配置文件加载... ├── sharding-proxy-frontend 启动socket,代理mysql/pg │ ├── sharding-proxy-frontend-core 启动sokcet │ ├── sharding-proxy-frontend-mysql

mysql(2):索引

假如想象 提交于 2020-01-26 00:08:10
索引基础 索引介绍 定义 索引是满足某种特定查找算法的数据结构。这些数据结构会以某种方式指向数据,从而实现高效查找。 优势 提高了查询速度 劣势 降低更新表的速度,因为更新表时,MySQL不仅要保存数据,还要保存索引文件。 建立索引会占用磁盘空间的索引文件。 索引分类 主键索引 根据主键pk_column(length)建立索引, 不允许重复,不允许空值 。 ALTER TABLE 'table_name' ADD PRIMARY KEY pk_index('col'); 唯一索引UNIQUE 用来建立索引的列的值必须是 唯一的,允许空值 。 ALTER TABLE 'table_name' ADD UNIQUE INDEX index_name('col'); 普通索引 用 普通列 构建的索引,没有任何限制。 ALTER TABLE 'table_name' ADD INDEX index_name('col'); 组合索引 用多个列组合构建的索引,这多个列中的值不允许有空值。 ALTER TABLE 'table_name' ADD INDEX index_name('col1','col2','col3'); 遵循“最左前缀”原则,把最常用作为检索或排序的列放在最左,依次递减,组合索引 相当于建立了col1,[col1,col2],[col1,col2,col3]三个索引