MySql优化及基本架构

Posted 云鲤飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql优化及基本架构相关的知识,希望对你有一定的参考价值。

mysql优化及基本架构

认识MySql

MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,不管是开发还是小公司最适合不过了。主要是免费,穷屌丝可以省点钱买咖啡,但是也有高级的商业版。

Mysql的特点

一、MySQL数据库的特点和优势:

(1)功能强大
MySQL 中提供了多种数据库存储引擎,各引擎各有所长,适用于不同的应用场合,用户可以选择最合适的引擎以得到最高性能,可以处理每天访问量超过数亿的高强度的搜索 Web 站点。MySQL5 支持事务、视图、存储过程、触发器等。

(2)支持跨平台

MySQL 支持至少 20 种以上的开发平台,包括 Linux、Windows、FreeBSD 、IBMAIX、AIX、FreeBSD 等。这使得在任何平台下编写的程序都可以进行移植,而不需要对程序做任何的修改。

(3)运行速度快

高速是 MySQL 的显著特性。在 MySQL 中,使用了极快的 B 树磁盘表(MyISAM)和索引压缩;通过使用优化的单扫描多连接,能够极快地实现连接;SQL 函数使用高度优化的类库实现,运行速度极快。

(4)支持面向对象

php 支持混合编程方式。编程方式可分为纯粹面向对象、纯粹面向过程、面句对象与面向过程混合 3 种方式。

(5)安全性高

灵活和安全的权限与密码系统,允许基本主机的验证。连接到服务器时,所有的密码传输均采用加密形式,从而保证了密码的安全。

(6)成本低

MySQL 数据库开放源代码且无版权制约,是一种完全免费的产品,用户可以直接通过网络下载,自主性及使用成本低。体积小,安装方便。历史悠久,用户使用活跃,遇到问题可以寻求帮助,易于维护。

(7)支持各种开发语言

MySQL 为各种流行的程序设计语言提供支持,为它们提供了很多的 API 函数,包括 PHP、ASP.NET、Java、Eiffel、Python、Ruby、Tcl、C、C++、Perl 语言等。

(8)数据库存储容量大

MySQL 数据库的最大有效表尺寸通常是由操作系统对文件大小的限制决定的,而不是由 MySQL 内部限制决定的。InnoDB 存储引擎将 InnoDB 表保存在一个表空间内,该表空间可由数个文件创建,表空间的最大容量为 64TB,可以轻松处理拥有上千万条记录的大型数据库。

(9)支持强大的内置函数

PHP 中提供了大量内置函数,几乎涵盖了 Web 应用开发中的所有功能。它内置了数据库连接、文件上传等功能,MySQL 支持大量的扩展库,如 MySQLi 等,可以为快速开发 Web 应用提供便利。

相比其他数据库的特点和优势

(1) 对事务的提交

MySQL默认是自动提交,不需要在写commit指令或者点击commit按钮。

(2) 分页查询

MySQL是直接在SQL语句中写"select… from …where…limit m, n",有limit就可以实现分页。PHP里还可以用SEEK定位到结果集的位置。

(3) 事务隔离级别

MySQL是read commited的隔离级别。

一个session读取数据时,其他session不能更改数据,但可以在表最后插入数据。session更新数据时,要加上排它锁,其他session无法访问数据。

(4) 复制简单

MySQL复制服务器配置简单。

(5) 自动增长的数据类型处理

MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。

(6) 单引号的处理

MYSQL里可以用双引号包起字符串。

(7) 日期字段的处理

MYSQL日期字段分DATE和TIME两种。

(8) 空字符的处理

MYSQL的非空字段也有空的内容,NULL或空字符。

MySQL架构

mysql可以分为网络连接层、服务层、存储引擎层和系统文件层。

  1. 网络连接层
    客户端连接器提供与MySQL服务器建立的支持。目前几乎支持所有主流的服务器编程技术,例如常见的Java、PHP、ASP.NET、Eiffel、Python、Ruby、C、C++等,它们通过各自的API技术与MySQL建立连接。
  2. 服务层
    它是MySQL的核心,主要包含系统管理和控制工具、连接池、SQL接口、解析器、查询优化器和缓存六个部分。

连接池:负责存储和管理客户端与数据库的连接,一个线程负责管理一个连接。
系统管理和控制工具:例如备份恢复、安全管理、集群 管理等
SQL接口:用于接受客户端发送的各种SQL命令,并且返回用户需要查询的结果。比如DML、DDL、存储过程、视图、触发器等。
解析器:负责将请求的SQL解析生成一个"解析树"。然后根据一些MySQL规则进一步检查解析树是否合法。
查询优化器:当“解析树”通过解析器语法检查后,将交由优化器将其转化成执行计划,然后与存储引擎交互
缓存:缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,权限缓 存,引擎缓存等。如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。

  1. 存储引擎层
    存储引擎负责MySQL中数据的存储与提取,与底层系统文件进行交互。MySQL存储引擎是插件式的,服务器中的查询执行引擎通过接口与存储引擎进行通信,接口屏蔽了不同存储引擎之间的差异 。现在有很多种存储引擎,各有各的特点,最常见的是MyISAM和InnoDB。

  2. 系统文件层
    该层负责将数据库的数据和日志存储在文件系统之上,并完成与存储引擎的交互,是文件的物理存储层。主要包含日志文件,数据文件,配置文件,pid 文件,socket 文件等。

抛开复杂的架构设计,MySQL优化思想基本都在这

优化一览图

抛开复杂的架构设计,MySQL优化思想基本都在这


优化

抛开复杂的架构设计,MySQL优化思想基本都在这


笔者将优化分为了两大类:软优化和硬优化。软优化一般是操作数据库即可;而硬优化则是操作服务器硬件及参数设置。

1、软优化

1)查询语句优化

首先我们可以用EXPLAIN或DESCRIBE(简写:DESC)命令分析一条查询语句的执行信息。

例:

	DESC SELECT * FROM `user`

显示:

抛开复杂的架构设计,MySQL优化思想基本都在这


其中会显示索引和查询数据读取数据条数等信息。

2)优化子查询

在MySQL中,尽量使用JOIN来代替子查询。因为子查询需要嵌套查询,嵌套查询时会建立一张临时表,临时表的建立和删除都会有较大的系统开销,而连接查询不会创建临时表,因此效率比嵌套子查询高。

3)使用索引

索引是提高数据库查询速度最重要的方法之一,使用索引的三大注意事项包括:

  • LIKE关键字匹配'%'开头的字符串,不会使用索引;

  • OR关键字的两个字段必须都是用了索引,该查询才会使用索引;

  • 使用多列索引必须满足最左匹配。

4)分解表

对于字段较多的表,如果某些字段使用频率较低,此时应当将其分离出来从而形成新的表。

5)中间表

对于将大量连接查询的表可以创建中间表,从而减少在查询时造成的连接耗时。

6)增加冗余字段

类似于创建中间表,增加冗余也是为了减少连接查询。

7)分析表、检查表、优化表

分析表主要是分析表中关键字的分布;检查表主要是检查表中是否存在错误;优化表主要是消除删除或更新造成的表空间浪费。

分析表: 使用 ANALYZE 关键字,如ANALYZE TABLE user

抛开复杂的架构设计,MySQL优化思想基本都在这


  • Op:表示执行的操作;

  • Msg_type:信息类型,有status、info、note、warning、error;

  • Msg_text:显示信息。

检查表: 使用 CHECK关键字,如CHECK TABLE user [option]。option 只对MyISAM有效。共五个参数值:

  • QUICK:不扫描行,不检查错误的连接;

  • FAST:只检查没有正确关闭的表;

  • CHANGED:只检查上次检查后被更改的表和没被正确关闭的表;

  • MEDIUM:扫描行,以验证被删除的连接是有效的,也可以计算各行关键字校验和;

  • EXTENDED:最全面的的检查,对每行关键字全面查找。

优化表: 使用OPTIMIZE关键字,如OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE user;

LOCAL|NO_WRITE_TO_BINLOG都是表示不写入日志,优化表只对VARCHAR、BLOB和TEXT有效,通过OPTIMIZE TABLE语句可以消除文件碎片,在执行过程中会加上只读锁。

2、硬优化

1)硬件三件套

  • 配置多核心和频率高的cpu,多核心可以执行多个线程;

  • 配置大内存,提高内存,即可提高缓存区容量,因此能减少磁盘I/O时间,从而提高响应速度;

  • 配置高速磁盘或合理分布磁盘:高速磁盘提高I/O,分布磁盘能提高并行操作的能力。

2)优化数据库参数

优化数据库参数可以提高资源利用率,从而提高MySQL服务器性能。MySQL服务的配置参数都在my.cnf或my.ini,下面列出性能影响较大的几个参数:

  • key_buffer_size:索引缓冲区大小;

  • table_cache:能同时打开表的个数;

  • query_cache_size和query_cache_type:前者是查询缓冲区大小,后者是前面参数的开关,0表示不使用缓冲区,1表示使用缓冲区,但可以在查询中使用SQL_NO_CACHE表示不要使用缓冲区,2表示在查询中明确指出使用缓冲区才用缓冲区,即SQL_CACHE;

  • sort_buffer_size:排序缓冲区。

3)分库分表

因为数据库压力过大,首先一个问题就是高峰期系统性能可能会降低,因为数据库负载过高对性能会有影响。

另外一个,压力过大把你的数据库给搞挂了怎么办?

所以此时你必须得对系统做分库分表+读写分离,也就是把一个库拆分为多个库,部署在多个数据库服务上,这时作为主库承载写入请求。然后每个主库都挂载至少一个从库,由从库来承载读请求。

抛开复杂的架构设计,MySQL优化思想基本都在这


4)缓存集群

如果用户量越来越大,此时你可以不停的加机器,比如说系统层面不停加机器,就可以承载更高的并发请求。

然后数据库层面如果写入并发越来越高,就扩容加数据库服务器,通过分库分表是可以支持扩容机器的,如果数据库层面的读并发越来越高,就扩容加更多的从库。

但是这里有一个很大的问题:

数据库其实本身不是用来承载高并发请求的,所以通常来说,数据库单机每秒承载的并发就在几千的数量级,而且数据库使用的机器都是比较高配置,比较昂贵的机器,成本很高。

如果你就是简单的不停的加机器,其实是不对的。

所以在高并发架构里通常都有缓存这个环节,缓存系统的设计就是为了承载高并发而生。单机承载的并发量都在每秒几万,甚至每秒数十万,对高并发的承载能力比数据库系统要高出一到两个数量级。

你完全可以根据系统的业务特性,对那种写少读多的请求,引入缓存集群。

具体来说,就是在写数据库的时候同时写一份数据到缓存集群里,然后用缓存集群来承载大部分的读请求。这样的话,通过缓存集群,就可以用更少的机器资源承载更高的并发。


结语


一个完整而复杂的高并发系统架构中,一定会包含各种复杂的自研基础架构系统和各种精妙的架构设计,因此一篇小文顶多具有抛砖引玉的效果。但是总得来看,数据库优化的思想差不多就这些了。希望能对大家有所帮助

以上是关于MySql优化及基本架构的主要内容,如果未能解决你的问题,请参考以下文章

最近很火的MySQL:抛开复杂的架构设计,MySQL优化思想基本都在这

高性能可扩展MySQL数据库设计及架构优化 电商项目

高性能可扩展MySQL数据库设计及架构优化 电商项目_1

低价高性能可扩展MySQL数据库设计及架构优化MySQL企业级架构设计项目实战视频教程

16高性能可扩展MySQL数据库设计及架构优化 电商项目

MySQL性能管理及架构设计:数据库结构优化高可用架构设计数据库索引优化...