MySQL索引优化
环境搭建建表语句123456789101112131415161718 CREATE TABLE `dept` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `deptName` VARCHAR(30) DEFAULT NULL, `address` VARCHAR(40) DEFAULT NULL, ceo INT NULL , PRIMARY KEY (`id`)) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; CREATE TABLE `emp` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `empno` INT NOT NULL , `name` VARCHAR(20) DEFAULT NULL, `age` INT(3) DEFAULT NULL, `deptId` INT(11) DEFAULT NULL, PRIMARY KEY (`id`) #CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REF ...
MySQL之Explain性能分析
简介查看执行计划,使用Explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL 语句的。分析你的查询语句或是表结构的性能瓶颈。
能干嘛?
表的读取顺序
哪些索引可以使用
数据读取操作的操作类型
哪些索引被实际引用
表之间的引用
每张表有多少行被物理查询
使用:Explain + SQL语句
id(重要)select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序
id相同,执行顺序由上至下
id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行。
id相同不同,同时存在。在所有组中,id值越大,优先级越高,越先执行 。id如果相同,可以认为是一组,从上往下顺序执行。
衍生 = DERIVED
如上图所示,在id为1时,table显示的是 <derived2> ,这里指的是指向id为2的表,即t3表的衍生表。
id号每个号码,表示一趟独立的查询。一个sql 的查询趟数越少越好。
select_type
查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询。
SIMPLE简 ...
MySQL索引
概念MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。索引的本质是一种数据结构。是排好序可以快速查找的数据结构
索引的目的在于提高查询效率,可以类比字典,
如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。
如果没有索引,那么你可能需要a—-z,如果我想找到Java开头的单词呢?或者Oracle开头的单词呢?
是不是觉得如果没有索引,这个事情根本无法完成?
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
下图就是一种可能的索引方式示例:
左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址
为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到相应数据,从而快速的检索出符合条件的记录。
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往 ...
MySQL存储引擎
简介通过show engines;,查看 mysql 现在已提供什么存储引擎
1.InnoDB存储引擎
InnoDB是MySQL的默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。
2.MyISAM存储引擎
MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级锁,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。
3.Archive引擎
Archive档案存储引擎只支持INSERT和SELECT操作,在MySQL5.1之前不支持索引。
Archive表适合日志和数据采集类应用。
根据英文的测试结论来看,Archive表比MyISAM表要小大约75%,比支持事务处理的InnoDB表小大约83%。
4.Blackhole引擎
Blackhole引擎没有实现任何存储机制,它会丢弃所有插入的数据,不做任何保存。但服务器会记录Blackhole表的日志,所以可以用于复制数据到备库,或者简单地记录到日志。但这种应用方式会碰到很多问题,因此并 ...
MySQL逻辑架构
总体概览 和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,
插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离 。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。
MySQL之外类似Java程序访问
和连接池沟通
查询缓冲,缓存
SQL接口分析sql
解析器复杂sql解析
优化器,不影响结果进行优化,生成执行计划
存储引擎按计划分类执行
存入缓存
返回结果
1.连接层
最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
2.服务层
2.1 Management Serveices & Utilities : 系统管理和控制工具
2.2 SQL Interface : SQL接 ...
MySQL存储过程和函数
存储过程和函数:类似于java中的方法提高代码的重用性,简化操作。
存储过程一组预先编译好的SQL语句的集合,理解成批处理语句,提高代码的重用性,简化操作,减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率。
创建使用12345CREATE PROCEDURE 存储过程名(参数列表)BEGIN 存储过程体(一组合法的SQL语句)END
参数列表包含三部分: 参数模式 参数名 参数类型。in stuname varchar(20)
如果存储过程体仅仅只有一句话,begin end可以省略。
存储过程体中的每条sql语句的结尾要求必须加分号。
存储过程中的参数相当于局部变量。直接通过 SET 变量名 = 值 赋值
存储过程的结尾可以使用 delimiter 重新设置。(5.7后可以不用设置,设置了记得改回来)
调用语法: CALL 存储过程名(实参列表);
参数模式
in:该参数可以作为输入,也就是该参数需要调用方传入值
out:该参数可以作为输出,也就是该参数可以作为返回值
inout:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
空参插入 ...
MySQL变量
系统变量系统变量由系统定义,不是用户定义,属于服务器层面。系统变量分为全局变量,会话变量。
全局变量需要添加global关键字,会话变量需要添加session关键字,如果不写,默认会话级别
查看全局变量 show global variables;
查看会话变量 show session variables;或者show variables;
查看满足条件的部分系统变量 show global |[session] variables like '%char%';
查看指定的系统变量的值 select @@global|[@@session].系统变量名;
为某个系统变量赋值 set global|[session]系统变量名=值;或者set @@global|[@@session].系统变量名=值;
全局变量作用域:针对于所有会话(连接)有效,但不能跨重启。(重启数据库失效)
123456789#①查看所有全局变量SHOW GLOBAL VARIABLES;#②查看满足条件的部分系统变量SHOW GLOBAL VARIABLES LIKE '%cha ...
HashMap源码分析
哈希表简介在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下(后面会探讨下哈希冲突的情况),仅需一次定位即可完成,时间复杂度为O(1),接下来我们就来看看哈希表是如何实现达到惊艳的常数阶O(1)的。
我们知道,数据结构的物理存储结构只有两种:顺序存储结构和链式存储结构(像栈,队列,树,图等是从逻辑结构去抽象的,映射到内存中,也这两种物理组织形式),而在上面我们提到过,在数组中根据下标查找某个元素,一次定位就可以达到,哈希表利用了这种特性,哈希表的主干就是数组。
比如我们要新增或查找某个元素,我们通过把当前元素的关键字 通过某个函数(散列函数,哈希函数)映射到数组中的某个位置,通过数组下标一次定位就可完成操作。
这个函数可以简单描述为:存储位置 = f(关键字) ,这个函数f一般称为哈希函数,这个函数的设计好坏会直接影响到哈希表的优劣。
我们第一时间能想到的最简单的哈希函数就是取余%操作
例如我新增或查找某个元素,当前数组的长度为8,我们按照存储位置=f(关键字)。散列函数f就为f(i%8)(范围为[0,7]正好是数组的索引范围)。
同理当我们想要获取到元素时, ...
ArrayList源码扩容机制分析
ArrayList 简介ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。
ArrayList继承于 AbstractList,实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口。
12public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{}
RandomAccess 是一个标志接口(空接口),表明实现这个这个接口的 List 集合是支持快速随机访问的。在 ArrayList 中,我们即可以通过元素的序号快速获取元素对象,这就是快速随机访问。(原因是:底层是使用Object[]数组存 ...
学而不思
您好, 这里需要密码.56a46fc528b8cad91272e5ff69568c80918f7d76a001de95d9686254130768afc4089622dd053ea25da28b15b7ce5da4f60d4587997453912bbdd69f2466d391e23c60c76191701845922f37baf0c3d30796f8183fd4eb0da4d19645d0af5b23a986956a8072e071f32646cf7edf81e460dd8ae6202ebb49e812bba3e0ed369dc6a2a46b654145ab13e8c17253d627271c21c574d088a85d2ceb8ebc0a092e21fb4a79e0f60216174117d5d3791c608df796ce1688ef72a7242a2a5b004dd75183668eda6391d2fe901a009b4e60eca9cf19b24561979b8a62988becd09dee36f2735be658ad8e3152ed9d362f23550662c7e6e0e ...