sql优化

MySQL基础篇(05):逻辑架构图解和InnoDB存储引擎详解

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-03 07:56:25
本文源码: GitHub·点这里 || GitEE·点这里 一、MySQL逻辑架构 1、逻辑架构图 基于下面的逻辑架构图,可以大致熟悉MySQL各个架构组件之间的协同工作关系。 很经典的C/S架构风格,即客户端/服务端模式。 2、分层描述 客户端连接 通常会进行连接池管理,连接用户权限认证,安全管理等操作。 可以通过如下命令查看连接配置信息: SHOW VARIABLES LIKE '%connect%'; 可以看到最大连接和每个连接占用的内存等相关配置。 核心功能 第二层架构封装MySQL一系列核心操作,查询解析、优化、缓存、内置函数、触发器、视图等,跨存储引擎的功能都在这一层实现。 存储引擎 MySQL的最底层封装,也是最核心的功能,不同的存储引擎有不同的特点功能,共同点是处理数据的存储和提取。 二、概念简介 1、存储引擎 MySQL数据库存储引擎是数据库底层的架构组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还具有不同的特点功能,以满足不同场景下的业务需求。 2、支持关系 可以通过下面两个命令查看MySQL当前版本,和对存储引擎的支持情况。 SELECT VERSION() ; SHOW ENGINES ; 可以看出本地环境是MySQL5.7,支持如下几种存储引擎:

sql索引

左心房为你撑大大i 提交于 2020-03-03 05:47:26
1、创建索引 create index index_name on table_name 删除索引 delete index index_name on table_name 2、B-tree索引和Hash索引 hash索引只在memory支持。当我们要给某张表某列增加索引时,将这张表的这一列进行哈希算法计算,得到哈希值,排序在哈希数组上。所以Hash索引可以一次定位,其效率很高,而Btree索引需要经过多次的磁盘IO。 但是它存在很多缺点: ~只能用于等式比较,不能查询范围。 ~优化器不能用hash索引来加速Oder by操作。 ~不能用部分索引键来搜索,因为组合索引在计算哈希值的时候是一起计算的。只能使用整个关键字来搜索一行。 ~数据量特别大的时候,没有b-tree效率高。 3、建立索引的规则: ~利用最左前缀:Mysql会一直向右查找直到遇到范围操作(>,<,like、between)就停止匹配。比如a=1 and b=2 and c>3 and d=6;此时如果建立了(a,b,c,d)索引,那么后面的d索引是完全没有用到,当换成了(a,b,d,c)就可以用到。 ~不能过度索引:在修改表内容的时候,索引必须更新或者重构,所以索引过多时,会消耗更多的时间。 ~尽量扩展索引而不要新建索引 ~最适合的索引的列是出现在where子句中的列或连接子句中指定的列。

MySql基础

浪子不回头ぞ 提交于 2020-03-03 01:40:59
这是我第一次写博客,写的不好希望大家指正(说实话,有点紧张)。 今天我们要把MySql的内部"拆解"开来,通过了解MySql内部当我们发生问题时能够更快速的定位到问题。 下面是MySql的基本架构示意图,从图中可以观察到SQL语句在MySql中的执行过程 连接器:提供与客户端连接的服务。对用户输入的用户名和密码进行校验。 如果用户名或密码不正确,就会提示"Access denied for user"的错误,随后客户端程序结束。 如果通过用户名密码通过验证,则连接器就会到权限表中查出你的权限,以后这个连接的权限都和此时读到的权限相同。 这就意味着,一个用户建立了连接后,即使你使用管理员账号对这个用户的权限进行修改,也不会影响已经存在连接的权限。修改后,只能新建连接才能使用新的权限。 当客户端长时间没动静,连接器就会自动将其断开(默认为8小时,通过show global variables like ‘wait_timeout’;查看全局时间)。这个时间是由wait_timeout控制。 连接完成后,如果没有进行操作,则这个连接就处于空闲状态,使用show processlist;可以查看连接状态。如下图,其中command列显示为sleep则为空闲连接。 查询缓存:MySql内置的一种缓存机制,比如我们进行select * from student查询

Centos7下安装Mysql8

眉间皱痕 提交于 2020-03-03 01:36:48
1、Mysql8的优点 一些关键的增强包括: SQL窗口函数,公用表表达式,NOWAIT和SKIP LOCKED,降序索引,分组,正则表达式,字符集,成本模型和直方图。 JSON扩展语法,新功能,改进排序和部分更新。使用JSON表函数,您可以使用JSON数据的SQL机制。 GIS地理支持。空间参考系统(SRS),以及SRS感知空间数据类型,空间索引和空间功能。 可靠性 DDL语句已变得原子性和崩溃安全,元数据存储在单个事务数据字典中。由InnoDB提供支持! 可观察性性能架构,信息架构,配置变量和错误记录的显着增强。 可管理性远程管理,撤消表空间管理和新的即时DDL。 安全 OpenSSL改进,新的默认身份验证,SQL角色,分解超级特权,密码强度等等。 性能 InnoDB在读/写工作负载,IO绑定工作负载和高争用“热点”工作负载方面明显更好。增加了资源组功能,通过将用户线程映射到CPU,为用户提供一个选项,以针对特定硬件上的特定工作负载进行优化。 基于以上的一些优点,所有我觉得在新项目中使用mysql8。 2、安装Mysql8 2.1 下载mysql的安装包 wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm 2.2 运行命令进行安装Mysql源 yum localinstall

Sql语句防注入

北慕城南 提交于 2020-03-02 23:50:32
用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的 SQL Injection ,即 SQL 注入。 SQL 注入是从正常的 WWW 端口访问,而且表面看起来跟一般的 Web 页面访问没什么区别,所以目前市面的防火墙都不会对 SQL 注入发出警报,如果管理员没查看 IIS 日志的习惯,可能被入侵很长时间都不会发觉。 但是, SQL 注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的 SQL 语句,从而成功获取想要的数据,是高手与 “ 菜鸟 ” 的根本区别。 根据国情,国内的网站用 ASP+Access 或 SQLServer 的占 70% 以上, PHP+MySQ 占 L20% ,其他的不足 10% 。在本文,我们从分入门、进阶至高级讲解一下 ASP 注入的方法及技巧, PHP 注入的文章由 NB 联盟的另一位朋友 zwell 撰写,希望对安全工作者和程序员都有用处。了解 ASP 注入的朋友也请不要跳过入门篇,因为部分人对注入的基本判断方法还存在误区。大家准备好了吗? Let's Go... 入门篇 如果你以前没试过 SQL 注入的话,那么第一步先把 IE 菜单 => 工具 =>Internet 选项 => 高级 => 显示友好 HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误, IE

【MyBatis】映射文件示例

心不动则不痛 提交于 2020-03-02 19:53:59
本文以实例说明Mapper文件的标签的使用。 配置文件在 【MyBatis】配置文件示例 DAO文件 DepartmentMapper.java package com.atguigu.mybatis.dao; import com.atguigu.mybatis.bean.Department; public interface DepartmentMapper { public Department getDeptById(Integer id); public Department getDeptByIdPlus(Integer id); public Department getDeptByIdStep(Integer id); } EmployeeMapper.java package com.atguigu.mybatis.dao; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Param; import com.atguigu.mybatis.bean.Employee; public interface EmployeeMapper { /

MySQL 中的数据类型介绍

。_饼干妹妹 提交于 2020-03-02 19:32:16
1、概述 要了解一个数据库,我们也必须了解其支持的数据类型。 MySQL支持所有标准的SQL数据类型,主要分3类: 数值类型 字符串类型 时间日期类型 另一类是几何数据类型,用的不多,也没多介绍。 下面大、小标题后括号内的数组表示其含有的类型个数。下面所有结论都经过本人使用MySql Workbench编写SQL验证过或来自官网。 2、数值类型(12) 2.1、整数类型(6) 一张图就能解释清楚了: INTEGER同INT。 2.2、定点数(2) DECIMAL和NUMERIC类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值。 使用方式如下: salary DECIMAL(5,2) 下面的介绍将基于上面这个例子。 我们看到其中有两个参数,即DECIMAL(M,D),其中M表示十进制数字总的个数,D表示小数点后面数字的位数,上例中的取值范围为-999.99~999.99。 如果存储时,整数部分超出了范围(如上面的例子中,添加数值为1000.01),MySql就会报错,不允许存这样的值。 如果存储时,小数点部分若超出范围,就分以下情况: 若四舍五入后,整数部分没有超出范围,则只警告,但能成功操作并四舍五入删除多余的小数位后保存。如999.994实际被保存为999.99。 若四舍五入后,整数部分超出范围,则MySql报错,并拒绝处理。如999.995和-999

MySQL Schema与数据类型的优化

一世执手 提交于 2020-03-02 16:20:18
选择优化的数据类型: 1、 更小的通常更好: 一般情况下,应该尽量使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,因为他们占用更少的磁盘,内存和cpu缓存,并且处理时需要的cpu周期也更少。 2、 简单就好 简单的数据类型操作通常需要更少的cpu周期。例如,整型比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较比整型更加复杂。注:应使用mysql内建的类型存储时间和日期,而不是字符串。 3、 尽量避免null 如果查询中包含可为null的列,对Mysql来说更难优化,因为可为null的列使得索引、索引统计和值都比较复杂。可为null的列会使用更多的存储空间,在mysql中也需要特别处理。当可为null的列被索引时,每个索引记录需要一个额外的字节。 通常把可为null的列改为not null带来的性能提升比较小。在调优时,没有必要首先在现有的shema中查找并修改掉这个情况,除非确定这会导致问题。但是如果列上建索引,就应尽量避免设计成可为null的列。 整数类型: 整数类型有TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT。分别使用8,16,24,32,64位存储空间。他们可以存储的值的范围从-2的(n-1)次方到2的(n-1)次方-1,其中n是存储空间的位数。 整数类型有可选的UNSIGNED属性,表示不允许负值

深入理解MySQL底层实现

自古美人都是妖i 提交于 2020-03-02 13:01:12
本文摘自: http://harlon.org/2018/06/20/database/ 深入理解MySQL底层实现 这里选用MySQL作为了解数据库的底层实现,这是因为MySQL是目前最常用的数据库,了解它的底层实现也基本上对目前大数据的数据库所用的技术会有一个大致的了解。数据库最主要的索引设计,了解数据库的索引设计基本上就对数据库有了大致的了解,其次对其事务的ACID操作实现原理做以分析,以及数据库中所用到的提高其性能的优化等等。 存储引擎 MySQL常用的存储引擎有InnoDB和MyISAM,其中MyISAM是MySQL的默认存储引擎。 InnoDB InnoDB的存储文件有两个,后缀名分别是.frm和.idb,其中.frm是表的定义文件,而idb是数据文件。InnoDB中存在表锁和行锁,不过行锁是命中索引的情况下才会起作用的。 InnoDB支持事务,且支持四种隔离级别,即原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏

神奇的 SQL 之 WHERE 条件的提取与应用

你。 提交于 2020-03-02 12:18:48
问题描述 一条 SQL 在数据库中是如何执行的呢 ?相信很多人都会对这个问题比较感兴趣。但是,感兴趣归感兴趣,你得去追呀,还臆想着她主动到你怀里来 ? 一条 SQL 在数据库中的生命周期涵盖了 SQL 的词法解析、语法解析、权限检查、查询优化、SQL执行等一系列的步骤,是一个相当复杂的过程,不亚于你追她的艰苦历程,不是只言片语就说的完的。但是,大家先别紧张,上面说的那些了,今天一个也不讲,气不气 ? 今天和大家一起来看一下 SQL 生命周期中比较有意思的一个环节 给定一条 SQL,如何提取其中的 where 条件 ? where 条件中的每个子条件,在 SQL 执行的过程中有分别起着什么样的作用 ? SQL 执行流程 这是 MySQL 数据库中 SQL 的执行流程,其他数据库应该类似 关系型数据库中的数据组织 关系型数据库中,数据组织涉及到两个最基本的结构:表与索引。表中存储的是完整数据记录,分为堆表和聚簇索引表;堆表中所有的记录无序存储,聚簇索引表中所有的记录则是按照记录主键进行排序存储。索引中存储的是完整记录的一个子集,用于加速记录的查询速度,索引的组织形式,一般均为B+树结构 MySQL 的 InnoDB 采用的是聚簇索引表,数据记录和索引是一起存储的,类似如下 InnoDB 二级索引(非聚簇索引)的结构与聚集索引的结构基本相同,只是叶子节点有些许差别