MySQL主从复制

前言随着业务的增长,一台数据服务器已经满足不了需求了,负载过重。这个时候就需要减压了,实现负载均衡读写分离,一主一丛或一主多从。 主服务器只负责写,而从服务器只负责写,从而提高了效率减轻压力。 主从复制有可以分为: 主从同步:当用户写数据主服务器必须和从服务器同步了才告诉用户写入成功,等待时间比较长。 主从异步:只要用户访问写数据主服务器,立即返回给用户。 主从半同步:当用户访问写数据主服务器写入并同步其中一个从服务器就返回给用户成功

MySQL的锁机制

MySQL锁的概述锁是计算机协调多个进程或线程并发访问某一资源的机制。MySQL中不同的存储引擎支持不同的锁机制。InnoDB存储引擎支持行级锁和表级锁,默认情况下使用的是行级锁。MyISAM支持表级锁。表级锁:开销小,加锁快,不会出现死锁,锁定粒度大,发生锁冲突的概览极高,并发度最低。行级锁: 开销大,加锁满,会出现死锁,锁定粒度最小,发生锁冲突的概览最低,并发度也最高。页面锁: 开销和加锁时间介于表锁和行锁之间,会出现死锁,锁定粒度介于表锁和行锁之间,并发度一般。 MyISAM表锁MySQL的表级锁有两种模式:表共享读锁,表独占写锁。对MyISAM的读不会阻塞其它用户的读请求,但是会阻塞对同一表的写请求。当一个线程获得了一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其它读写操作都会被阻塞。 如何加表锁MyISAM在执行select操作之前会自动给涉及到的表加读锁。在执行更新操作(update,insert,delete)前,会自动给涉及到的表添加写锁。因此一般是不需要显式的去加锁的。一般手动加锁是模拟事务:比如:检查两个表的合计金额是否相同, 123//这种写法显然可能会出现错误(第一条sql执行之后,可能会有金额变动)select sum(total) from orders;select sum(subtotal) from order_detail;

高性能MySQL读书笔记一

索引基础索引类似于书的目录。存储引擎在索引中找到对应值,然后再根据匹配的索引记录找到对应的数据行。索引可以包含一个活多个列的值。如果索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高校地利用索引地最左前缀列。 索引的类型索引有很多类型,MySQL的索引是在存储引擎层实现的,所以没有统一的索引标准。 B-Tree索引大多少MySQL引擎都支持这种索引。他们的内部实现也是不同的,有些存储引擎使用T-Tree结构存储这种索引,有些使用B+Tree。当然性能也各有不同。B-Tree通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同相同。B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始进行搜索。B-Tree对索引是顺序组织存储的,所以很适合查找范围数据索引对多个值进行排序的依据是建表语句中定义的索引列的顺序进行排序的。B-Tree索引适用于全键值、键值范围或键前缀查找。其中键前缀查找只适用于根据最左前缀的操作。 1234567create table People( last_name varchar(50) not null, first_name varchar(50) not null, dob date not null, gender enum('m','f') not null, key(last_name,first_name,dob))

MySQL技术内幕学习笔记四

视图视图是基于基表的虚表,它由sql查询来定义,可以当作表使用,但是视图中的数据没有实际的物理存储。视图可以作为安全层使用。其作用在于一些应用程序本身并不关心基表,只需要按照视图定义来存取数据。 oracle提供的物化视图Oracle支持物化视图,其不再是虚表,而是基于基表实际存在的表。物化视图可以用于预先计算并保存多表的链接或聚集等耗时操作的结果。在SQL server数据库中称为索引视图。在mysql 中可以使用基表加触发器的策略来实现“物化视图”。 分区表innodb存储引擎支持水平分区,主要用于数据库的高可用管理。 MySQL数据库支持以下几种分区 range分区行数据基于给定分一个连续区间的列值被放入分区 list分区行数据基于一些离散的值被放入分区。 hash分区根据用户自定义的表达式的返回值进行分区(返回值不能是负,必须是整数) key分区根据mysql提供的哈希函数进行分区 如果表中存在唯一索引或主键那么分区列必须是其的一部分

MySQL技术内幕学习笔记三

文件概要 文件类型 参数文件 日志文件 socket文件 pid文件 MySQL表结构文件 存储引擎文件 参数文件 在MySQL实例启动时,会读取一个参数文件进行初始化。 MySQL可以没有参数文件。如果没有参数文件,就以源代码中的默认值为标准。 MySQL的参数分为动态参数,静态参数。动态参数可以在MySQL实例运行的时候更改,而静态参数在MySQL实例的整个生命周期内都不能更改。 日志文件 记录了影响了MySQL数据库的各中类型的活动。 日志文件的类型一般包括:错误日志,二进制日志,慢查询日志,查询日志。 慢查询日志,会记录运行超过long_query_time(默认值为10s)的sql语句。 查询日志,记录了所有对MySQL数据库的请求。默认文件名为:主机名.log。未能正确执行的请求也会被记录。 二进制日志,记录所有对MySQL进行更改的操作。其作用包括恢复数据,复制,审计。 套接字文件 在unix系统下连接本地MySQL可以使用unix套接字方式。该方式需要一个套接字文件。

MySQL技术内幕学习笔记二

重做日志缓存 重做日志缓冲(redo log buffer) 重做日志缓冲同样也在innodb内存区。innodb存储引擎会将重做日志信息先放到重做日志缓冲区,然后以一定的频率刷新到重做日志中。 重做日志缓冲不必太大。因为一般每一秒都会刷新到重做日志文件中。默认为8MB,该值可以由innodb_log_buffer_size控制 重做日志缓冲刷新的三种情况。1.master thread每一秒都会刷新一次。 2.每次事务提交时都会刷新一次。 3.重做日志缓冲池剩余空间小于1/2时,会刷新。 额外的内存池 额外的内存池 innodb存储引擎采用一种称为内存堆的方式进行。在给一些数据结构分配内存时,会从额外的内存池中申请,但该内存中的内存不足时,会从缓冲池中申请。 SQL语句的分类 数据库查询语言DQL -各种查询 数据操纵语言DML 增删改 数据定义语言DDL 用来创建数据库中的各种对象,如表,视图,索引等 数据控制语言DCL 授权,回滚数据库等

MySQL技术内幕学习笔记一

数据库是物理操作系统文件或其它形式文件类型得集合。 实例是数据库后台线程和共享内存区。通常数据库和实例是一一对应的关系。一个数据库对应一个实例。 MySQL是一个单进程多线程架构的应用。 MySQL数据库启动时会按照/etc/my.cnf–>/tec/mysql/my.cnf–>/usr/local/mysql/etc/mycnf–>~/.my.cnf的顺序读取配置文件(也可能是.ini后缀)。如果配置文件中有相同的配置则按最后一个读取的文件进行配置。如果没有配置文件,则使用数据库默认参数。 innodb采用聚集的方式存储数据。每张表都是按主键的顺序进行存放的。如果没有显式的在表中定义主键。innodb会为每一行生成一个6字节的ROWID作为主键。 innodb存储引擎的体系架构后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。还要负责将已修改的数据文件刷新到新的磁盘文件。还要保证数据库发生异常情况时,能恢复innodb存储引擎到正常的运行状态。