Mysql优化基础
Posted FINANCE RETAIL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql优化基础相关的知识,希望对你有一定的参考价值。
mysql优化基础(1)
Mysql
逻辑架构
•第一层并不是MySQL
独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构。比如连接处理、授权认证、安全等等。•第二层是MySQL
多数核心功能位置,包括查询解析、分析、优化、缓存以及所有的内置函数(日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。•第三层包含了存储引擎。存储引擎负责MySQL
中数据的存储和提取。服务器通过API
与存储引擎进行通信,这些API
屏蔽了不同存储引擎之间的差异。
Mysql逻辑架构:
Mysql
中的并发控制
•**读写锁 **在处理并发读或者写时,可以通过实现一个由两种类型的锁组成的锁系统来解决问题。这两种类型的锁通常被称为共享锁(Shared Lock
)和排它锁(Exclusive Lock
),也叫读锁(Read Lock
)和写锁(Write Lock
)。读锁是共享的,写锁是排它的,一个写锁会阻塞其它写锁和读锁。•锁粒度MySQL
中不同的存储引擎支持不同的锁机制:MyISAM
与MEMORY
存储引擎采用表级锁;BDB
存储引擎采用的是页级锁,也支持表级锁;InnoDB
存储引擎既支持行级锁,也支持表级锁,默认采用行级锁。•表级锁MySQL
中开销最小的策略,加锁速度快,锁定整张表,粒度大。不会出现死锁,发生锁竞争的概率最高,并发度最低,性能最差。•行级锁开销大,加锁速度慢,锁定一行数据,粒度小。会出现死锁,发生锁竞争的概率最低,并发读最高,性能高。•页级锁开销和加锁速度介于表锁和行锁之间,锁定一页数据。会出现死锁,锁竞争概率、并发性、性能均位于表锁和行锁之间。
Mysql
事务
什么是事务?
事务就是一组原子性的SQL
查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么执行该组查询。如果其中有任何一条语句应为崩溃或其他原因无法执行,那么所有的语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。良好的事务必须满足四大特性。
事务的四大特性
•原子性(Atomicity
) :一个事务中的SQL
,要么全部执行,要么全部不执行;•一致性(Consistency
):一个事务执行前后,数据库中的所有约束依然满足;•隔离性(Isolation
):一个事务执行过程中,数据不受另一个事务的影响;•持久性(Durability
):一个事务执行完成后,事务对数据的修改必须持久化到数据库中。
事务隔离级别
隔离性其实比想象的要复杂。在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。
•READ UNCOMMITTED
(未提交读):事务中的修改,即使没有提交,对其他事务也都是可见的•READ COMMITTED
(已提交读/不可重复读):事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的•REPEATABLE READ
(可重复读):同一事务中多次读取同样的记录结果是一致的,MySQL
默认•SERIALIZABLE
(序列化):事务串行执行
隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
READ UNCOMMITTED |
Y | Y | Y | N |
READ COMMITTED |
N | Y | Y | N |
REPEATABLE READ |
N | N | Y | N |
SERIALIZABLE |
N | N | N | Y |
死锁
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。多个事务同时锁定同一个资源时,也会产生死锁。如下:
事务1:
START TRANSACTION;
UPDATE customer SET first_name = 'LINDA' WHERE customer_id=1;
UPDATE customer SET first_name = 'LISA' WHERE customer_id=2;
COMMIT;
事务2:
START TRANSACTION;
UPDATE customer SET last_name = 'JONES' WHERE customer_id=2;
UPDATE customer SET last_name = 'LEE' WHERE customer_id=1;
COMMIT;
如果刚好两个事务都执行了第一个条update
语句,更新了一行数据,同时也锁定了该行数据。接着两个事务都尝试去执行第二条update
语句,发现该行数据已经被对方锁定,然后两个事务都等待对方释放锁,同时又持有对方需要的锁,则陷入了死循环。
事务日志
存储引擎在修改表的数据时,使用事务日志,使得只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久化到磁盘。
事务日志采用追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O
,而不像随机I/O
需要在磁盘的多个地方移动磁头。事务日志持久以后,内存中被修改的数据在后台可以慢慢的刷回到磁盘。我们通常称为预写式日志,修改数据需要写两次磁盘。
如果数据的修改已经记录到事务日志并持久化,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这部分修改的数据。
存储引擎
查看数据库存储引擎支持:SHOW ENGINES
;
InnoDB
引擎
InnoDB
表是基于聚簇索引建立的,其索引结构和MySQL
的其他存储引擎有很大区别。内部做了很多优化,包括从磁盘读取数据时采用的可预测性预读。
MyISAM
引擎
在MySQL 5.1
版本之前,MyISAM
是默认的存储引擎。MyISAM
提供了大量的特性,包括全文检索、压缩、空间函数等,但MyISAM
不支持事务和行级锁,而有一个缺陷就是崩溃后无法安全恢复。虽然MyISAM
有这样的缺陷,但并非一无是处。对于只读的数据,或者表比较小,可以忍受修复操作,则依然可以继续使用MyISAM
引擎。
MyISAM
特性
1.加锁与并发:MyISAM
对整张表加锁,而不是针对行。读取时会对需要读到的所有表加共享锁,写入则对表加排它锁。在表有读取查询的同时,也可以往表中插入新的记录(被称为并发插入)。2.修复:MySQL
可以对MyISAM
表进行手工或者自动检查和修复操作,但这里所说的修复和事务恢复以及崩溃修复是不同的概念。执行表的修复可能导致一些数据丢失,而且修复操作非常慢。可以通过CHECK TABLE tableName
检查表的错误,如果有错误可以通过执行REPAIR TABLE tableName
进行修复。3.索引特性:对于MyISAM
表,即使是BLOB
和TEXT
等长字段,也可以基于前500个字符创建索引。MyISAM
也支持全文索引,这是一种基于分词创建的索引,可以支持复杂的查询。4.延迟更新索引建:创建MyISAM
表的时候,如果指定了DELAY_KEY_WRITE
选项,在每次修改执行完成时,不会立刻将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入到磁盘。可以极大的提升写入性能,但是数据库或者主机崩溃时会造成索引损坏,需要执行修复操作。
MyISAM
压缩表
可以使用myisampack
工具对MyISAM
表进行压缩。压缩表是不能进行修改的。压缩表可以极大的减少磁盘空间占用,因此也可以减少磁盘I/O
,从而提升查询性能。压缩表也支持索引,但索引也是只读的。压缩表中的记录是独立压缩的,所以读取单行的时候不需要去解压整个表。
Memory
引擎
在Memory
表中,所有的数据都是保存在内存中,不需要进行磁盘I/O
。重启时候会保留表结构,但数据会丢失。 修改表的存储引擎
1.ALTER TABLE tableName ENGINE = InnoDB
2.导出导入,可使用mysqldump工具
3.CREATE and SELECT
CREATE TABLE newTable LIKE oldTable;
ALTER TABLE newTable ENGINE=InnoDB;
INSERT INTO newTable SELECT * FROM oldTable;
性能优化的几个方面
MySQL
的性能优化主要在几个方面:
1.硬件优化2.系统配置优化3.数据库表结构优化4.SQL
及索引优化
以上是关于Mysql优化基础的主要内容,如果未能解决你的问题,请参考以下文章