Mysql_related

Practice in class 1-1

MySQL

版本演变:

1995年5月23日,MySQL的第一个内部版本发行了。

1996年10月,MySQL 3.11.1发布(MySQL没有2.x版本)。在接下来的两年里,MySQL被依次移植到各个平台,同时加入了不少新的特性。

1998年1月,MySQL关系型数据库发行了第一个版本。它使用系统核心的多线程机制提供完全的多线程运行模式,并提供了面向C、C++、Eiffel、Java、Perl、PHP、Python及Tcl等编程语言的编程接口(API),且支持多种字段类型,并且提供了完整的操作符支持。而且MySQL已经能够运行在10多种操作系统之上,其中包括应用非常广泛的 FreeBSD、Linux、Windows 95和Windows NT等。

很快MySQL 3.22也发布了,但它仍然存在很多问题,如不支持事务操作、子查询、外键、存储过程和视图等功能。

1999-2000年,MySQL开始支持事务处理。

2000年4月,MySQL对旧的存储引擎ISAM进行了整理,将其命名为MyISAM。

2001年,集成存储引擎InnoDB,这个引擎同样支持事务处理,还支持行级锁。该引擎之后被证明是最为成功的MySQL事务存储引擎。

2003年12月,MySQL 5.0版本发布,提供了视图、存储过程等功能。

2008年1月,MySQL AB公司被Sun公司收购,MySQL数据库进入Sun时代。在Sun时代,Sun公司对其进行了大量的推广、优化、Bug修复等工作。

2008年11月,MySQL 5.1发布,它提供了分区、事件管理,以及基于行的复制和基于磁盘的NDB集群系统,同时修复了大量的Bug。

2009年4月20日,Oracle公司收购Sun公司,自此MySQL数据库进入Oracle时代,而其第三方的存储引擎InnoDB早在2005年就被Oracle公司收购。

2010年12月,MySQL 5.5发布,其主要新特性包括半同步的复制及对SIGNAL/RESIGNAL的异常处理功能的支持,最重要的是InnoDB存储引擎终于变为当前MySQL的默认存储引擎。MySQL 5.5加强了MySQL各个方面在企业级的特性。

2013年2月,MySQL5.6发布。Oracle最近宣布将于2021年2月停止5.6版本的更新,结束其生命周期。

2015年12月,MySQL5.7发布,其性能、新特性、性能分析带来了质的改变。

2016年9月,MySQL开始了8.0版本,Oracle宣称该版本速度是5.7的两倍,性能更好。

2018年4月,MySQL8.0.11发布。

目前,MySQL已更新到8.0.18版本,但市场主流都还是使用的5.5/5.6/5.7版本。

https://www.cnblogs.com/joyfulcode/p/12683009.html

SQL引擎

数据库引擎是用于存储、处理和保护数据的核心服务。

InnoDB:5.5版本后MySQL的默认数据库。支持事务,是事务型数据库的首选引擎。支持事务安全(ACID特性),支持行锁定和外键,比MyISAM处理速度稍慢

InnoDB主要特性有:

InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合;

InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系型数据库引擎锁不能匹敌的;

InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引放在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上;

InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显式在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键;

InnoDB被用在众多需要高性能的大型数据库站点上;

InnoDB不创建目录,使用InnoDB时,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件。

MyISAM:高速引擎,拥有较高的插入、查询速度,但不支持事务。MyISAM基于ISAM存储引擎,并对其进行扩展。是Web、数据仓储等应用环境下最常使用的存储引擎之一。

在5.1之前,MyISAM是默认的引擎,MyISAM有大量的特性,包括全文索引、压缩、空间函数。但是MyISAM不支持事务和行级锁,而且在崩溃后无法安全恢复。即使后续版本中MyISAM支持了事务,但是很多人的概念中依然是不支持事务的引擎。

对于一些只读数据,或者表空间较小,可以忍受恢复操作,可以使用MyISAM。MyISAM会将表存储在两个文件中:数据文件、索引文件。分别是.MYD、.MYI扩展名。MyISAM表可以包含动态或者静态行。MySQL会根据表定义选择那种行格式。MyISAM表的行记录数,取决于磁盘空间和操作系统中的单个文件最大尺寸。

在MySQL中,默认配置只能存储256TB的数据。因为指向数据记录的指针长度是6字节。需要修改可以修改表的MAX_ROWS和AVG_ROW_LENGTH选项,两个相乘是最大的大小。但会导致重建索引。

MyISAM是对整个表加锁,而不是行锁,读取的时候对表加共享锁,写入的时候加排他锁。但是在表有读取查询的同时,也可以往表内写入记录。

对于MyISAM,即使是Blob,Text等等长字段,也可以基于前500字符创建索引,MyISAM支持全文索引,这是一个基于分词创建的索引,也可以支持复杂的查询。

MyISAM可以选择延迟更新索引键,在创建表的时候指定delay_key_write选项,在每次修改执行完成时,不会立刻将修改的索引数据写入磁盘,而是写到缓存区,只有在清理缓存区或者关闭表的时候才会将索引写入磁盘。这可以极大的提升写入性能,但是在主机崩溃时会造成索引损坏,需要执行修复操作。

MyISAM另一个特性是支持压缩表。如果数据在写入后不会修改,那么这个表适合MyISAM压缩表。可以使用myisampack对MyISAM表进行打包,压缩表是不可以修改数据的。压缩表可以极大的减少磁盘占用,因此可以减少磁盘IO,提升性能,压缩表也支持索引,但是索引也是只读的。

由于没有行锁机制,所以在海量写入的时候,会导致所有查询处于Locked状态。

https://zhuanlan.zhihu.com/p/53619907

事务处理级别划分

事务隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

体系结构

由连接池组件、管理服务和工具组件、SQL接口组件、查询分析器组件、优化器组件、

缓冲组件、插件式存储引擎、物理文件组成。

Practice in class 2-1

  1. 在业务需求不是以固定的顺序访问表和行的时候,即交叉访问时,如果没有在业务逻辑上加上合适的锁,容易造成事务等待回路;

应尽量避免大事务,占有的资源锁越多,越容易出现死锁,所以可以在业务逻辑上将大事务拆分成小事务;

有些代码逻辑需要进行加锁分析以避免事务阻塞乃至死锁;

平常开发的时候如果对查询条件没有索引的,一定要进行一致性读,也就是加锁读,会导致全表加上索引,会导致其他事务全部阻塞,数据库基本会处于不可用状态。

https://blog.csdn.net/qq_41701956/article/details/81623448

  1. mysql数据库锁机制实现的特征?

根据锁锁定数据的颗粒度可分为表级锁、行级锁和页级锁;

行级锁与表级锁是可以共存的,InnoDB为了让表锁和行锁共存而引入了意向锁;

InnoDB中有几种行级锁类型:Record Lock、Gap Lock、Next-key Lock;

乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

无论是悲观锁还是乐观锁,都是人们定义出来的概念,可以认为是一种思想。针对于不同的业务场景,应该选用不同的并发控制方式。不要把乐观并发控制和悲观并发控制狭义的理解为DBMS中的概念,更不要把他们和数据中提供的锁机制(行锁、表锁、排他锁、共享锁)混为一谈。在DBMS中,悲观锁正是利用数据库本身提供的锁机制来实现的。

InnoDB的细粒度锁(即行锁),是实现在索引记录上的(如果未命中索引则会失效);

记录锁锁定索引记录;间隙锁锁定间隔,防止间隔中被其他事务插入;临键锁锁定索引记录+间隔,防止幻读;

InnoDB使用插入意向锁,可以提高插入并发;

间隙锁(gap lock)与临键锁(next-key lock)只在RR以上的级别生效,RC下会效;

https://www.cnblogs.com/volcano-liu/p/9890832.html

Practice in class 2-2

\1. Mysql针对优化的工具

1) mysqltuner-pl

数据库性能诊断工具,主要检查参数设置的合理性包括日志文件、存储引擎、安全建议及性能分析。

2) tuning-primer.sh

对于mysql的整体进行一个体检,对潜在的问题,给出优化的建议。

3) pt-variable-advisor

分析MySQL变量并就可能出现的问题提出建议。

4) pt-qurey-digest

从日志、进程列表和tcpdump分析MySQL查询。

性能监控工具

1) Nagios

一款用于系统和网络监控的应用程序。它可以在你设定的条件下对主机和服务进行监控,在状态变差和变好的时候给出告警信息。

2)MONyog

MONyog是一个轻量级的无代理的监控系统,它的实现方法较特殊:它的底层是一个JavaScript引擎,所有配置都是通过JavaScrpt对象模型来完成的。它被设计为在桌面系统上运行,运行时它会在一个闲置的端口上打开一个HTTP监听器。这样,可以把浏览器指向这个端口,查看MySQL服务器的信息了,这信息都是结合了Javascript和Flash来表示的。MONyog实际上有交互式和非交互式两种类型。

分析工具

1) HackMySQL

2) Maatkit分析工具

一系列命令行工具的集合。

https://www.cnblogs.com/javastack/p/12606106.html

https://www.cnblogs.com/ceshi2016/p/9068818.html

Practice in class 2-3

对于底层封装不去深入了解,只是知道如何使用,这样在功能升级或优化之后,不能很好的适应变化。

Practice in class 3-1

myisam的主键索引的叶子节点只存放数据在物理磁盘上的指针,其他次索引也是一样的;innodb的主键索引的叶子节点下面直接存放数据,其他次索引的叶子节点指向主键id。

Practice in class 3-2

​ 复合索引的使用原则是最左匹配原则,如果要查询的是y或z相关的数据行,则不会用到该复合索引;

当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。所以如果表是经常需要更新的,不适合做索引;

如果where条件中是OR关系,加索引不起作用;

数据量少的字段不需要加索引,维护开销大。

Practice in class 3-3

  1. 普通索引

普通索引是MySQL中最基本索引类型,基本上对列的数据不会加任何的限制,可以允许空值和重复值,最主要的用途就是加快数据的访问速度。

  1. 唯一索引

唯一索引指的是对数据添加了唯一性约束,这一列的数据当中不能够出现重复的值,但是可以有null值(至多有一个)。在创建唯一索引时会进行数据校验,如果此时已经有了重复数据,则索引创建失败。在建立唯一索引后,再向表中插入已有的重复数据时,也会被拒绝。

  1. 主键索引

主键索引的特点是:非空、唯一。所以如果我们想找一列作为每条数据的唯一标识,就会将这一列声明为主键。由于主键的特点,经常会被作为其他表外键的参照列,也是在进行数据同步时的主要参照。

  1. 复合索引

同一索引类型作用在多个不同列上时,可以称之为组合索引,对于主键索引,有一个特别的称呼:复合主键。(注意:复合主键与联合主键不是同一个含义,联合主键指的是将多个主键的值联合在一起,常出现在多对多逻辑的中间表中,比如:将两个有关联的数据主键定义在中间表中,然后再为中间表设立一个主键来唯一标识每一条关联数据)

  1. 全文索引

全文索引主要是作用在数据类型为CHAR、VARCHAR、TEXT的列上,用于长文本的字符串搜索加速。使用全文索引时,自然语言搜索的效率要大于LIKE关键字。

  1. 空间索引

空间索引主要是针对空间数据类型的列建立的,如:GEOMETRY。如果在某一列上建立空间索引,则必须声明为:NOT NULL,只有MyISAM引擎的表支持空间索引。

  1. 全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。

全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。

  1. 哈希索引

由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。

HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。

  1. B树索引

BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。

Practice in class 4-1

Mysql使用limit限定返回的行数,如下示例所示:SELECT * FROM USER LIMIT 0,10;

Practice in class 4-2

良好的交互界面,清晰明了的展示数据库信息;

可以使用户便捷管理数据库;

可以兼容多种类型的数据库;

启动速度快;

综合多种环境和平台的特点。可以支持同时连接任意数量级的MySQL服务器,用于测试和生产;

无需安装在Mysql服务器上,部署代价小;

可以减少对MySQL的访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值