mysql执行计划

MySQL索引及执行计划

[亡魂溺海] 提交于 2020-02-05 22:54:47
MySQL索引及执行计划 索引 合理的建立索引可以加快数据查询,例如,学校图书管为每一本书编号,根据编号可以快速锁定一本书所在位置。MySQL索引默认B+树索引。索引虽然能够提高检索效率,但同时也会降低更新的速度,因为 insert 、update、delete 也会操作索引文件,会调整因为更新等操作带来的键值变化后的索引信息。 索引类型 主键索引:唯一索引,并且并指定为 primary key ,每个表中只能有一个主键 唯一索引:索引列的所有值都只能出现一次,即值必须唯一,值可以为空 普通索引:基本的索引类型,值可以为空,没有唯一性限制 复合索引:一个索引中包含多个列 何时建立索引 主键自动创建唯一索引 频繁作为查询条件的字段适合创建索引 查询中与其他表关联的字段适合创建索引 频繁更新的字段不适合创建索引,因为在更新记录的同时会更新索引 where条件中使用不到的字段不需要创建索引 在高并发下,在单值索引和复合索引中,复合索引更合适 order by字段添加索引可以提高排序速度 不需要索引 表记录较少 经常增删改的表 数据重复且分布平均的表,如性别 执行计划 可以使用 explain 关键字模拟优化器执行sql查询语句,从而分析查询语句或者表结构的性能瓶颈。 通过查看执行计划,可以了解到表的读取顺序、数据读取操作、哪些索引可以使用、哪些索引被实际使用、表之间的引用

Mysql 索引

好久不见. 提交于 2020-02-05 02:07:38
一. 存储引擎 1. 什么是存储引擎? 与其他数据库例如Oracle 和SQL Server等数据库中只有一种存储引擎不同的是,MySQL有一个被称为“Pluggable Storage Engine Architecture”(可替换存储引擎架构)的特性,也就意味着MySQL数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。MySQL数据库在实际的工作中其实分为了语句分析层和存储引擎层,其中语句分析层就主要负责与客户端完成连接并且事先分析出SQL语句的内容和功能,而存储引擎层则主要负责接收来自语句分析层的分析结果,完成相应的数据输入输出和文件操作。简而言之,就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。 2. 存储引擎种类 存储引擎 说明 MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务 InnoDB 5.5版本后MySQL的默认数据库,支持事务和行级锁定,比MyISAM处理速度稍慢 ISAM MyISAM的前身,MySQL5.0以后不再默认安装 MRG_MyISAM(MERGE) 将多个表联合成一个表使用,在超大规模数据存储时很有用 Memory 内存存储引擎

我的MYSQL学习心得(九)

血红的双手。 提交于 2020-02-04 03:12:37
原文: 我的MYSQL学习心得(九) 我的MYSQL学习心得(九) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL学习心得(五) 我的MYSQL学习心得(六) 我的MYSQL学习心得(七) 我的MYSQL学习心得(八) 这一篇《我的MYSQL学习心得(九)》将会讲解MYSQL的索引 索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型。 根据存储引擎定义每个表的最大索引数和最大索引长度。所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节。 大多数存储引擎有更高的限制。MYSQL中索引的存储类型有两种:BTREE和HASH,具体和表的存储引擎相关; MYISAM和InnoDB存储引擎只支持BTREE索引;MEMORY和HEAP存储引擎可以支持HASH和BTREE索引 索引的优点: 1、通过创建唯一索引,保证数据库表每行数据的唯一性 2、大大加快数据查询速度 3、在使用分组和排序进行数据查询时,可以显著减少查询中分组和排序的时间 索引的缺点: 1、维护索引需要耗费数据库资源 2、索引需要占用磁盘空间,索引文件可能比数据文件更快达到最大文件尺寸 3、当对表的数据进行增删改的时候,因为要维护索引,速度会受到影响 索引的分类 1

MySQL日常使用笔记

╄→尐↘猪︶ㄣ 提交于 2020-02-01 11:03:03
逍遥山人的MySQL使用笔记,持续更新中 表结构 新建表以及添加表和字段的注释 create table t_user( ID INT(11) primary key auto_increment comment '主键', NAME VARCHAR(255) comment '姓名', CREATE_TIME date comment '创建时间' )comment = '用户信息表'; 修改字段类型 alter table tablename modify column column_name varchar(30); 查看表结构 查看表的字段、字段类型、索引等 DESC tablename; 或 SHOW COLUMNS FROM tablename; 或包含字符集、字段注释等 SHOW FULL FIELDS from table_name; 查看表生成的DDL 注意表名不加单引号 show create table 表名; 查看分区表的分区情况 SELECT partition_name part, partition_expression expr, partition_description descr, table_rows FROM information_schema.PARTITIONS WHERE table_schema = SCHEMA() AND

如何书写高效的MySQL查询?

纵饮孤独 提交于 2020-02-01 10:22:20
How to write efficient MySQL query statements WHERE子句中的书写注意事项 模糊查询(like)时需要注意的事项 索引 字段类型 表连接时的注意事项 其他注意事项 WHERE 子句中的书写注意事项 首先应考虑在 where 及 order by 涉及的列上建立索引。 下列操作会导致引擎放弃使用索引而进行全表扫描,是应尽量避免的。 1).在 where 子句中使用 != 或 <> 操作符 2).在 where 子句中对字段进行 null 值判断 如: select id from t where num is null; 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0; 3).在 where 子句中使用 or 来连接条件 如: select id from t where num=10 or num=20; 可以这样查询: select id from t where num=10 union all select id from t where num=20; 4).in 和 not in 也要慎用 如: select id from t where num in(1,2,3); 对于连续的数值,能用 between 就不要用 in 如:

[MySQL]Query的性能优化分析(二)

北慕城南 提交于 2020-01-30 04:33:24
MySQL Query Optimizer MySQL Query Optimizer是MySQL中专门负责优化SELECT语句的模块,其主要功能是:通过计算分析系统中收集到的统计信息,为客户端请求的Query提供MySQL认为最优的执行计划 1 。 优化器执行过程: 客户端向MySQL发起Query请求; 命令解析器模块完成请求分类,区别出SELECT并转发给MySQL Query Optimizer(查询优化器); 查询优化器对整条Query进行优化,处理掉一些常量表达式的预算,直接换算成常量值; 查询优化器对Query中的查询条件进行简化和转换,如去掉一些无用或显而易见的条件、结构调整等; 分析Query中是否有Hint消息,是否可以通过Hint信息完全确定该Query的执行计划; 若没有Hint信息或不足以完全确定执行计划,则会读取所涉及对象的统计信息,根据Query进行写相应的计算分析,得出最后的执行计划。 查看执行计划:Explain Explain的作用 使用EXPLAIN关键字可以通过模拟优化器执行SQL查询语句了解MySQL是如何处理SQL语句,从而分析查询语句或是表结构中的性能瓶颈。 使用Explain可以了解到: 表的读取顺序:通过执行计划中的id判断 数据读取操作的操作类型:通过执行计划中的select_type判断 哪些索引可以使用

MySQL优化

烂漫一生 提交于 2020-01-29 15:58:54
一、SQL语句优化 (1)使用limit对查询结果的记录进行限定 (2)避免select *,将需要查找的字段列出来 (3)使用连接(join)来代替子查询 (4)拆分大的delete或insert语句 二、选择合适的数据类型 (1)使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob (2)使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数 (3)使用合理的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar (4)尽可能使用not null定义字段 (5)尽量少用text,非用不可最好分表 三、选择合适的索引列 (1)查询频繁的列,在where,group by,order by,on从句中出现的列 (2)where条件中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)出现的列 (3)长度小的列,索引字段越小越好,因为数据库的存储单位是页,一页中能存下的数据越多越好 (4)离散度大(不同的值多)的列,放在联合索引前面。查看离散度,通过统计不同的列值来实现,count越大,离散程度越高: mysql> SELECT COUNT(DISTINCT column_name) FROM table_name;

MySQL学习笔记(二)

坚强是说给别人听的谎言 提交于 2020-01-29 11:38:25
服务器性能剖析 1、性能指标 基准测试是针对系统设计的一种压力测试。 吞吐量: 单位时间内的事务处理数(TPS) 响应时间或延迟 并发性 可扩展性 SHOW STATUS 和SHOW PROCESSLIST 命令 tcpdump Schema与数据类型优化 数据类型选择 更小的通常更好,占用更少的磁盘、内存和CPU缓存。 简单就号,占用更少的CPU周期。如整型比字符操作代价更低。 尽量避免NULL。查询中包含NULL列,优化会更困难,索引、索引统计和值都会变的复杂。可为NULL的列会使用更多的存储空间。 如果计划在列中建索引,应尽量避免可谓NULL的列。 BLOB和TEXT区别在于BLOB存储的是二进制数据,没有排序规则和字符集,而TEXT类型有字符集和排序规。MySQL只对每个列的最前max_sort_length字节做排序。不能将列全部长度做索引,也不能使用这些索引消除排序。如果EXPLAIN执行计划中Extra列包含“Using temporary” 则说明这个查询使用了隐式临时表。 schema设计 不可有太多的列: 存储引擎API工作时需要在服务器层和存储引擎层之间通过行缓冲格式拷贝数据,然后再服务器层将缓冲内容解码成各个列。从行缓冲中将编码过的列转换成行数据结构的操作代价是非常高的。 不可进行太多的关联: 单个查询最好再12个表以内做关联。在设计的时候最好向单表查询靠拢

如何检测MySQL是否命中索引?

别说谁变了你拦得住时间么 提交于 2020-01-29 00:13:47
在日常工作中,我们有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,此时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描。所以我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。(QEP:sql生成一个执行计划query Execution plan) mysql> explain select * from servers; +----+-------------+---------+------+---------------+------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+------+---------------+------+---------+------+------+-------+ | 1 | SIMPLE | servers | ALL | NULL | NULL | NULL | NULL |

mysql索引之组合索引

霸气de小男生 提交于 2020-01-28 05:07:04
这是你的表结构,有三个字段,分别是id,name,cid CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `cid` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `name_cid_INX` (`name`,`cid`),) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 索引方面:id是主键,(name,cid)是一个多列索引。 ----------------------------------------------------------------------------- 下面是你有疑问的两个查询: EXPLAIN SELECT * FROM student WHERE cid=1; EXPLAIN SELECT * FROM student WHERE cid=1 AND name='小红'; 你的疑问是:sql查询用到索引的条件是必须要遵守最左前缀原则,为什么上面两个查询还能用到索引? --------------------------------------------------------------------