MySQL总结

MySQL的优点:简单、高效、可靠、性能好、数据插入和查询的效果好。本身没有事务支持,通过第三方数据引擎Innodb支持,Innodb支持4种事务隔离级别。

主要适用场景:

1:Web网站系统

2:数据仓库系统(支持主从复制)

3:日志记录系统(数据插入和查询的效果好)

4:嵌入式系统


MySQL的核心架构:第一层:SQL Layer

                                 第二层:存储引擎层,底层数据存取操作

核心模块:初始化模块、连接模块、线程模块、连接线程、解析器模块、表管理器、表修改模块、优化模块、用户模块、访问控制模块、核心API、网络交互模块、表维护模块(主要是.frm文件)、高速缓存模块、命令调度模块、存储引擎模块、日志记录模块、主负责服务器模块、从复制服务器模块、Client/Server协议API等

一般过程:初始化->连接管理->Client/Server协议API->线程模块->连接线程->用户认证->解析器模块(查询或命令)->缓存->优化->表的操作模块->访问控制->表管理->存储引擎,全程都有日志模块参与


Mysql中有用的参数:--prompt=name:表示进入后的格式

                                  --tee=name:将所有的的输入和输出都记录到文件,方便查阅。

一般用在监控上的命令:mysqladmin -u用户 -p密码 -h主机  ping

                                            mysqladmin -u用户 -p密码 -h主机  status
                                            mysqladmin -u用户 -p密码 -h主机  processlist


存储引擎总结:默认是MyISAM

MyISAM:每个表只有三个文件:.frm存表结构信息,.MYD存表的数据,.MYI存索引的数据,

                  支持三个索引:B-Tree索引、R-Tree索引、全文索引(存储结构也是B-Tree)

                  若其中一个表出错,仅影响该表,不会影响其他表。

InnoDB:支持事务安全、支持MVCC(多版本并发,通过快照和Undo回滚数据)、行锁(索引完成)、外键

                表数据和索引数据存放在一起,且用共享表空间还是独享表空间(.ibd)又用户决定,并且重做日志文件好

NDB Cluster:主要用于分布式集群环境,属于内存式存储引擎

Memory:数据存储在内存中的引擎,不会将任何数据放在硬盘上,只放一个表结构相关信息的.frm文件,支持Hash和B-tree索引,支持页级锁定

BDB:每个表有两个文件:.frm和.db,数据和索引数据放在.db上,支持事务安全,有重做日志(REDO),支持页级锁定

BLACKHOLE:用在数据迁移上面,没有任何数据,但是会在二进制文件(binlog)中记录所有的查询,将这些查询法制利用,实施到最终端


MySQL的三道安全防线:网络->主机防火墙之类->MySQL本身的用户认证和访问控制


MySQL备份:

1:利用mysqldump进行逻辑备份,如果能在同一时刻取出所有数据,则要保证存储引擎为InnoDB或者BDB,保证能在同一事务中;

                                                              如果保证数据库中的数据静止,则要锁表,保证只读不写。

mysqldump原理是在指定数据库上追个扫描表获取数据,生成Insert语句在写入备份文件。

2:生成特定格式的纯文本备份文件,相比Insert比存储空间小,结构清晰,缺点是一个备份文件不能存多个表的数据。

3:对数据库的物理对象进行备份为物理备份,向对物理数据、日志、配置文件进行备份。

4:冷备份:停掉数据库之后的备份

5:增量备份:先必有某个时间点的完整备份,在这个点之后到现在这个点之间的内容我增量备份。


MySQL的锁定机制:行级锁定(InonoDB/NDB)、页级锁定(Memory/BDB)、表级锁定(MyISAM)

行级锁定:锁定对象的颗粒度小,则发生锁定资源的争用率小,但是获取锁跟释放锁操作多,消耗就大,最容易发生死锁;

表级锁定:逻辑简单,成本小,对于颗粒度大的锁定机制,会将所有表锁定,获取锁跟释放锁操作快,避免死锁,缺点是资源争用率高;

页级锁定:颗粒度介于前两者之间,会发生死锁



锁机制优化MySQL:   缩短锁定时间,将大查询拆成小查询;

                                    建立合适的索引;

                                    尽量让表只存放必要信息;

                                    合理利用同读写优先级;

                                    对于InnoDB来说,在业务允许下,尽量使用低级别的事务隔离级别,降低成本

在InnoDB下避免死锁:1、尽可以一次性将所用的表进行锁定;

                                     2、尽可能按照相同的顺序来访问;


查询优化(自带优化模块部分):充分利用Explain和Profiling

索引优化:MySQL的4类索引:B树、哈希索引、全文索引、R树索引,索引是完全独立于基础数据之外的一部分数据

建立索引的好处:提高检索效率、降低数据排序成本;

                 缺点是更新数据时,索引数据也要更新,增加了计算量和IO量和索引数据的存储空间增大;


MyISAM优化:索引缓存优化(key cache(cache block)),选择适当的参数;

                       使用多个key cache,不同的key cache放不同性质的数据(频繁使用且少修改、多修改且少使用、其他);

                       表读取缓存优化,即每次读取数据文件所需的内存缓冲区;

                       利用OPTIMIZE命令定期优化整理;

InnoDB优化:合理设置InonoDB_buffer_pool_size

                      两次写缓存,在写到硬盘之前,先写一份到表空间的系统保留的存储空间;

                      自适应哈希索引,给缓冲池中的数据做索引,提高Buffer Pool中的数据的访问效率;

                      事务优化,选择合适的事务隔离级别,READ UNCOMMITTED是脏读;READ COMMITTED不会出现脏读,可能有不可重复读和幻读;

                                                                                REPEATABLE READ不会出现脏读和不可重复读,有可能有幻读;默认隔离级别

                                                                                SERIALIZABLE隔离级别最高级,脏读,不可重复读,幻读都没有;

                      合适的事务日志大小,若大,则IO性能也就高,但遇Crash恢复的时候时间长;

                      非聚集索引尽量小,提高访问效率,且逐渐尽量不要更新,减少主键变化的移动成本;


MySQL日志优化:日志记录打开越多,IO资源所用越大


性能优化:

1:充分利用CPU多核的处理能力---innodb_read_io_threads/innodb_write_io_threads

2:提高刷新脏页数量和合并插入数量,改善磁盘I/O处理能力---innodb_io_capacity

3:增加自适应刷新脏页功能---innodb_adpative_flushing

4:让InnoDB_Buffer_Pool缓冲池中的热数据存活更久

5:适当加快数据的恢复时间

6:使InnoDB支持多个BufferPool,像哈希表一样,不同的功能使用不同的BufferPool---innodb_buffer_pool_instances

7:通常情况下,哈希索引能提高查询性能,但在高并发情况下,应该关闭自适应哈希索引,避免堵塞进程

8:可以适当选择合适的内存分配程序

9:提高默认的Innodb线程并发数



影响性能的因素:

1:硬件条件

2:操作系统层面-----磁盘I/O,内存--BufferPool,CPU,网络I/O

3:SQL语句



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值