mysql数据库

从原理到优化,深入浅出数据库索引

爷,独闯天下 提交于 2020-02-26 02:08:32
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 数据库查询是数据库的最主要功能之一,我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化,这篇文章对索引做一个系统的梳理,希望对大家有帮助。 一、MySQL有哪些索引类型 索引的分类可以从多个角度进行,下面分别从数据结构,物理存储和业务逻辑三个维度进行划分。 1、从数据结构角度 (1)B+树索引(O(log(n))) 关于B+树索引,后面会深入解析 (2)hash索引 仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询 其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引 只有Memory存储引擎显示支持hash索引 (3)FULLTEXT索引 现在MyISAM和InnoDB引擎都支持了 (4)R-Tree索引 用于对GIS数据类型创建SPATIAL索引 2、从物理存储角度 (1)聚集索引(clustered index) 正文内容按照一个特定维度排序存储,这个特定的维度就是聚集索引; Innodb存储引擎中行记录就是按照聚集索引维度顺序存储的,Innodb的表也称为索引表;因为行记录只能按照一个维度进行排序

分布式调度平台 xxl-job 个人改进(灌水)思路

旧街凉风 提交于 2020-02-26 02:06:09
分布式调度平台 xxl-job 个人改进(灌水)思路 本人 刚入门 后端开发, 错误之处请批评指正 被导师安排的🌚 本人于2019年9月6日与同事进行的分享 1 xxl-job 是什么 1.1 xxl-job 是什么 轻量级、易扩展的分布式任务调度框架 通过Cron表达式配置计划任务 0 0/30 9-18 ? * MON-FRI 朝九晚六每半个小时执行 支持多语言(Java、Shell、Python、NodeJS、PHP、PowerShell 等,需要执行器部署环境支持),任务逻辑可在 Web 界面编写代码,或在执行器编写代码 1.2 常见任务调度框架 Quartz Java 常用计划任务框架,虽然 Quartz 可以基于数据库实现作业的高可用,但分布式并行调度方面有所欠缺。 elastic-job 当当开发的弹性分布式任务调度系统,功能丰富强大,采用 zookeeper 实现分布式协调,实现任务高可用以及分片。 xxl-job 是大众点评员工徐雪里于2015年发布的分布式任务调度平台,是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 1.3 xxl-job 与 elastic-job 怎么选 xxl-job 核心设计目标是开发迅速、学习简单、轻量级、易扩展 登记在用公司数>228家 开箱即用 持续更新,社区活跃、文档齐全 elastic

MySQL高可用集群之MHA

血红的双手。 提交于 2020-02-26 01:53:37
MySQL高可用集群之MHA 一、MHA简介 MHA(Master High Availability) 目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。 在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。 MHA里有两个角色一个是 MHA Node(数据节点) 另一个是MHA Manager(管理节点) 。 MHA Manager 可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。 MHA Node 运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。 MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志

MySQL伪事务和性能

时光总嘲笑我的痴心妄想 提交于 2020-02-26 01:26:26
用表锁定代替事务 在MySQL 的MyISAM类型数据表中,并不支持COMMIT(提交)和ROLLBACK(回滚)命令。当用户对数据库执行插入、删除、更新等操作时,这些变化的数据都被立刻保存在磁盘中。这样,在多用户环境中,会导致诸多问题,为了避免同一时间有多个用户对数据库中指定表进行操作。可以应用表锁定来避免在用户操作数据表过程中受到干扰。当且仅当该用户释放表的操作锁定后,其他用户才可以访问这些修改后的数据表。 应用表锁实现伪事务 实现伪事务的一般步骤如下: 对数据库中的数据表进行锁定操作,可以对多个表做不同的方式锁定 执行数据库操作,向锁定的数据表中执行添加、删除、修改操等操作 释放锁定的数据表,以便让正在队列中等待查看或操作的其他用户可以浏览数据表中的数据或对操作表执行各种数据的操作。 事务和性能 应用不同孤立级的事务可能会对系统造成一系列影响,采用不同孤立级处理事务,可能会对系统稳定性和安全性等诸多因素造成影响。另外,有些数据库操作中,不需要应用事务处理,则用户在选择数据表类型时,需要选择合适的数据表类型。所以,在选择表类型时,应该考虑数据表具有完善的功能,且高效的执行前提下,也不会对系统增加额外的负担。 应用小事务 应用小事务的意义在于:保证每个事务不会在执行前等待很长时间,从而避免各个事务因为互相等待而导致系统的性能大幅度下降。 选择合适的孤立级

mysql实现高可用架构之MHA

柔情痞子 提交于 2020-02-26 00:00:25
mysql实现高可用架构之MHA 一、简介 MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover (自动化主故障转移)功能。MHA 在监控到 master 节点故障时,会提升其中拥有最新数据的 slave 节点成为新的master 节点,在此期间,MHA 会通过于其它从节点获取额外信息来避免一致性方面的问题。 MHA 还提供了 master 节点的在线切换功能,即按需切换 master/slave 节点。 MHA 是由日本人 yoshinorim(原就职于DeNA现就职于FaceBook)开发的比较成熟的 MySQL 高可用方案。MHA 能够在30秒内实现 故障切换,并能在故障切换中,最大可能的保证数据一致性。目前淘宝也正在开发相似产品 TMHA, 目前已支持一 主一从。 二、MHA 服务 2.1 服务角色 MHA 服务有两种角色, MHA Manager(管理节点)和 MHA Node(数据节点): MHA Manager: 通常单独部署在一台独立机器上管理多个 master/slave 集群(组),每个 master/slave 集群称作一个 application,用来管理统筹整个集群。 MHA node: 运行在每台 MySQL 服务器上(master/slave

Mysql 备份恢复与 xtrabackup备份

笑着哭i 提交于 2020-02-26 00:00:12
Mysql 备份恢复与 xtrabackup备份 1.1 备份的原因   备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低。衡量备份恢复有两个重要的指标:恢复点目标(RPO)和恢复时间目标(RTO),前者重点关注能恢复到什么程度,而后者则重点关注恢复需要多长时间。 1.1.1 备份的目录   做灾难恢复:对损坏的数据进行恢复和还原   需求改变:因需求改变而需要把数据还原到改变以前   测试:测试新功能是否可用 1.1.2 备份中需要考虑的问题   可以容忍丢失多长时间的数据;   恢复数据要在多长时间内完;   恢复的时候是否需要持续提供服务;   恢复的对象,是整个库,多个表,还是单个库,单个表。 1.1.3 备份的类型 热备份:   这些动态备份在读取或修改数据的过程中进行,很少中断或者不中断传输或处理数据的功能。使用热备份时,系统仍可供读取和修改数据的操作访问。 冷备份:   这些备份在用户不能访问数据时进行,因此无法读取或修改数据。这些脱机备份会阻止执行任何使用数据的活动。这些类型的备份不会干扰正常运行的系统的性能。但是,对于某些应用程序,会无法接受必须在一段较长的时间里锁定或完全阻止用户访问数据。 温备份:   这些备份在读取数据时进行,但在多数情况下,在进行备份时不能修改数据本身

Mysql 更新语句执行流程

∥☆過路亽.° 提交于 2020-02-25 23:51:15
我们来看看更新语句的执行流程 与查询流程不一样的是,更新流程涉及两个重要的日志模块,redo log和 binlog redo log 如果每一次的更新操作都需要写进磁盘,然后磁盘也 要找到对应的那条记录, 然后再更新,整个过程 IO 成本、查找成本都很高 Mysql使用WAL机制来进行数据更新,WAL 的全称 是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘 当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log 里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做 InnoDB 的 redo log 是固定大小的,从头开始写,写到末尾就又回到开头循环写 write pos 是当前记录的位置,一边写一边后移,写到文件末尾后就回到开头。 checkpoint 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件 write pos 和 checkpoint 之间的是文件上还空着的部分,可以用来记录新的操作。如 果 write pos 追上 checkpoint,表示满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把 checkpoint 推进一下 有了 redo log,InnoDB

[MySQL]配置多个MySQL服务(Windows)

懵懂的女人 提交于 2020-02-25 23:27:04
配置多个MySQL服务 1、复制原解压好的MySQL文件到本目录下,且改名为MySQL2 2、修改MySQL2文件夹中的my.ini 修改my.ini文件中的以下内容,并保存文件: [client] port= 3307 [mysqld] port= 3307 #Path to installation directory. All paths are usually resolved relative to this. basedir=" E:/MySql/MySQL2/ " #Path to the database root datadir=" E:/MySql/MySQL2/Data/ " 3、配置环境变量 在path变量下添加:E:\MySql\MySQL2\bin 4、以管理员身份打开命令窗口,安装MySQL2服务 命令:E:\MySql\MySQL2\bin\mysqld install MySQL2 --defaults-file="E:\MySql\MySQL2\my.ini" 5、安装成功,以管理员身份启动MySQL2服务 命令:net start MySQL2 6、MySQL2默认没有密码,需要修改密码 关闭MySQL2的服务: 命令:net stop MySQL2 切换到mysqld命令下的MySQL2的文件夹下: 命令:cd E:\MySql\MySQL2

SQL注入入门

自作多情 提交于 2020-02-25 22:11:00
9块9的SQL注入公开课笔记 目录 SQL注入简介 MySQL入门 PHP基本入门 注入讲解 SQL注入简介 SQL注入是一种将SQL代码添加到输入参数中传递到SQL服务器解析并执行的一种方法 SQL注入产生条件: 有传递参数 参数传入到数据库中 在数据库中执行 MySQL入门 information_schema数据库 MySQL大致分为两类,MySQL5.0以上及以下 MySQL5.0以上会增加一个information_schema系统数据库 information_schema系统数据库 在mysql中把information_schema看作是一个数据库,确切说是信息数据库,其中保存着关于mysql服务器维护的所有其他数据库信息 SCHEMATA表 ​ 提供当前mysql实例中所有数据库信息 TABLES表 提供了关于数据库中表的信息,详细表述了某个数据库中所有表的信息 COLUMNS表 提供了表中的列信息,详细描述了某张表的所有列以及每个列的信息 mysql库下的user表中存放的是所有登录mysql数据库的用户名和密码 下列sqlmap语句都是查询的mysql库下的user表的里的列信息 sqlmap -u "xxx?id=1" --current-user //查询当前登录用户 sqlmap -u "xxx?id=1" --users /

MySQL索引那些事

亡梦爱人 提交于 2020-02-25 21:35:56
原文链接 大家有没有遇到过慢查询的情况,执行一条SQL需要几秒,甚至十几、几十秒的时间,这时候DBA就会建议你去把查询的 SQL 优化一下,怎么优化?你能想到的就是加索引吧? 为什么加索引就查的快了?这就要从索引的本质以及他的底层原理说起。 索引是什么 那索引到底是什么呢?你是不是还停留在大学学『数据库原理』时老师讲的“索引就像字典的目录”这样的概念?老师讲的没错,但没有深入去讲。 其实索引就是一种用于快速查找数据的数据结构,是帮助MySQL高效获取数据的排好序的数据结构。 索引的好处 举例说明索引的好处以及是怎么加快查询的。 假设我们有一个表t,它有俩字段,Col1和Col2,如下: 不加索引 不加索引的情况下,SQL: select * from t where t.col2=89 ,需要从表的第一行一行行遍历比对col2的值是否等于89,这样需要比对6次才能查到。这只是只有几行记录的表,那如果是百万级千万级的表呢?是不是就比较的次数就更多了,那还不得慢死。 加索引 如果col2这列加了索引,mysql内部会维护一个数据结构。假设mysql用的数据结构是红黑树(右子树的元素大于根节点,左子树的元素小于根节点)的数据结构建立索引,那就像上图右边那样。这样的话,刚才的那条SQL是不是只需要2次磁盘IO就查到了,是不是快很多了。 这就是索引的好处。索引使用比较巧妙的数据结构