mysql执行计划

阿里系统研发部数据库组教你一文搞懂 MySQL 单表查询的底层实现

那年仲夏 提交于 2019-11-25 20:48:46
对于我们这些 MySQL的使用者来说,平时用的最多的就是查询功能。DBA时不时丢过来一些慢查询语句让优化,如果连查询是怎么执行的都不清楚还优化个毛线,所以是时候掌握真正的技术了。 MySQL有一个称为 查询优化器的模块,一条查询语句进行语法解析之后就会被交给查询优化器来进行优化,优化的结果就是生成一个所谓的 执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户。不过查询优化这个主题有点儿大,在学会跑之前还得先学会走,所以本章先来瞅瞅 MySQL怎么执行单表查询(就是 FROM子句后边只有一个表,最简单的那种查询~)。 为了故事的发展,先得有个表: 我们为这个 single_table表建立了1个聚簇索引和4个二级索引,分别是: 为 id列建立的聚簇索引。 为 key1列建立的 idx_key1二级索引。 为 key2列建立的 idx_key2二级索引,而且该索引是唯一二级索引。 为 key3列建立的 idx_key3二级索引。 为 key_part1、 key_part2、 key_part3列建立的 idx_key_part二级索引,这也是一个联合索引。 然后我们需要为这个表插入10000行记录,除 id列外其余的列都插入随机值就好了,具体的插入语句我就不写了

二、锁的分类及特性

限于喜欢 提交于 2019-11-25 20:48:31
【转】锁的分类及特性 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问时变得有序所设计的一种规则。 对于任何一种数据库来说都需要有相应的锁定机制,所以 MySQL 自然也不能例外。 MySQL 数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎所针对的应用场景特点都不太一样。 为了满足各自特定应用场景的需求,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别。 MySQL 各存储引擎使用了三种类型(级别)的锁定机制: 表级锁定 行级锁定 页级锁定 表级锁定(table-level) 表级别的锁定是 MySQL 各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。 所以获取锁和释放锁的速度很快。由于表级锁定一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。 当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并大度大打折扣。 使用表级锁定的主要是 MyISAM,MEMORY,CSV 等一些非事务性存储引擎。   行级锁定(row-level) 行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。 由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小

mysql 缓存是如何使用内存的

☆樱花仙子☆ 提交于 2019-11-25 20:46:57
首先提一下查询缓存 在解析一个查询语句前,如果查询缓存是打开的,而且查询语句是命中查询缓存中的数据。在检查一次用户权限后直接返回缓存中的结果。这种情况下,查询不会被解析,也不会生成执行计划,更不会执行。 开启缓存也会带来开销,主要表现在以下几个方面: 任何的查询语句在开始之前都必须经过检查,即使这条SQL语句永远不会命中缓存 如果查询结果可以被缓存,那么执行完成后,会将结果存入缓存,也会带来额外的系统消耗 有的情况查询缓存不会被缓存,即使你使用 SQL_CACHE也不能缓存 主要为以下几种: 引用了用户自定义函数 引用了用户自定义变量 以用了存续过程 查询中包含一些实时的系统函数,比如now 引用了临时表 虽然上面说到缓存会带来一些开销,但是缓存对mysql还是很重要,带来的好处比坏处多。 那么mysql缓存是如何使用内存的? 查询缓存的内存池被分为大小可变的块,每一个快都知道自己的大小,指向前一个和后一个逻辑块和物理块 的指针,服务器启动时初始化查询缓存使用的物理内存,内存池开始会设置一个块,它的大小为被配置为缓存的大小减去自身需要的40KB大小。在每次缓存查询结果时,会为查询结果分配一个缓存块,但是服务器无法估计需要缓存的结果的大小,至少会大于等于query_cache_min_res_unit,,服务器在分配时,不会再缓存中一次生成最终结果然后缓存发送到客户端

自制小工具大大加速MySQL SQL语句优化(附源码)

你离开我真会死。 提交于 2019-11-25 20:40:57
引言 优化SQL,是DBA常见的工作之一。如何高效、快速地优化一条语句,是每个DBA经常要面对的一个问题。在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤。然而这些步骤重复性的执行,又会耗费DBA很多精力。于是萌发了自己编写小工具,提高优化效率的想法。 那选择何种语言来开发工具呢? 对于一名DBA来说,掌握一门语言配合自己的工作是非常必要的。相对于shell的简单、perl的飘逸,Python是一种严谨的高级语言。其具备上手快、语法简单、扩展丰富、跨平台等多种优点。很多人把它称为一种“胶水”语言,通过大量丰富的类库、模块,可以快速搭建出自己需要的工具。 于是乎,这个小工具就成了我学习Python的第一个作业,我把它称之为“MySQL语句优化辅助工具”。而且从此以后,我深深爱上了Python,并开发了很多数据库相关的小工具,以后有机会介绍给大家。 一、优化手段、步骤 下面在介绍工具使用之前,首先说明下MySQL中语句优化常用的手段、方法及需要注意的问题。这也是大家在日常手工优化中,需要了解掌握的。 1、执行计划 — EXPLAIN命令 执行计划是语句优化的主要切入点,通过执行计划的判读了解语句的执行过程。在执行计划生成方面,MySQL与Oracle明显不同,它不会缓存执行计划,每次都执行“硬解析”。查看执行计划的方法,就是使用EXPLAIN命令。 1)基本用法

MySql | InnoDB 多个单列索引与联合索引之路

被刻印的时光 ゝ 提交于 2019-11-25 20:18:59
简述: 为了提高数据库效率,建索引是家常便饭;那么当查询条件为2个及以上时,我们是创建 多个单列索引 还是创建 一个联合索引 好呢?他们之间的区别是什么?哪个效率高呢? 一、联合索引测试 注:Mysql版本为 5.7 创建测试表: CREATE TABLE `jlyx_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `user_code` varchar(32) NOT NULL DEFAULT '' COMMENT '账户编号', `user_name` varchar(32) DEFAULT '' COMMENT '账户名', `password` varchar(64) DEFAULT '' COMMENT '密码', `type` varchar(32) DEFAULT '2' COMMENT '1-管理员 2-运营人员 3-推广人员', `real_name` varchar(32) DEFAULT '' COMMENT '姓名', `phone` varchar(32) DEFAULT '' COMMENT '手机号', `email` varchar(32) DEFAULT NULL COMMENT '邮箱', `qq` varchar(32) DEFAULT NULL COMMENT 'QQ号', `last

神奇的 SQL 之 MySQL 性能分析神器 → EXPLAIN,SQL 起飞的基石!

六眼飞鱼酱① 提交于 2019-11-25 16:56:27
前言   开心一刻     某人养了一头猪,烦了想放生,可是猪认识回家的路,放生几次它都自己回来了。一日,这个人想了个狠办法,开车带着猪转了好多路进山区放生,放生后又各种打转,然后掏出电话给家里人打了个电话,问道:“猪回去了吗?”,家里人:“早回来了,你在哪了,怎么还没回来?”,他大怒道:“让它来接我,我特么迷路了!!!” 还不如我了 背景   某一天,楼主打完上班卡,坐在工位逛园子的时候,右下角的 QQ 闪了起来,而且还是个美女头像!我又惊又喜,脑中闪过我所认识的可能联系我的女性,得出个结论:她们这会不可能联系我呀,图像也没映象,到底是谁了?打开聊天窗口聊了起来   她:您好,我是公司客服某某某,请问 xxx后台 是您负责的吗?   我:您好,是我负责的,有什么问题吗?   她:我发现 xxx 页面点查询后,一直是 加载中... ,数据一直出不来,能帮忙看看吗?   我:是不是您的姿势不对?   她:我就 xxx,然后点查询   我:骚等下,我试试,确实有点慢,很长时间才能出来   她:是的,太慢了,出不来,都急死我了,能快点吗?   我:肯定能、必须能!您觉得什么速度让您觉得最舒服?   她:越快越好吧   我:呃...,是吗,我先看看是什么问题,处理好了告诉您,保证让您觉得舒服!   她:好的,谢谢!   公司没有专门的搜索服务,都是直接从 MySQL 查询