云时代架构阅读笔记时十

云时代架构阅读笔记十

(架构师必备的最全SQL优化方案)

  在项目的开发过程中我们最经常使用也是最为重要的便是数据库的使用,而当前的数据库也是多种多样,我所接触过的数据库有SqlServer、MySQL、oracle、SQLite等数据库,虽然有如此多种类的数据库,但其实他们之间的差距并不大。这次阅读的关于SQL的优化方案是针对于MySQL数据库进行讲解如何进行优化数据库。

  MySQL是一个关系型数据库给管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。

由于其社区版的性能卓越,搭配 MySQL和Apache 可组成良好的开发环境。

  随着越来越多的数据需求,大数据技术已经显得格外重要和抢眼,之所以大数据技术受到欢迎便是因为大数据技术对数据的存储、查询不同于往常的数据库。因此MySQL数据库的查询需要得到优化。优化并不是想着优化便能够实现的,优化也需要承担风险。因此对于优化来说解决问题而带来的问题应控制在可接受的范围内才是有成果的优化。

  那么优化数据库需要从哪些方面进行优化呢?:1.安全方面:数据的可持续性。2:性能方面:数据的高性能访问。

  优化的范围主要有:

    存储、主机和操作系统方面:主机架构稳定性、I/O设备划分以及配置、OS内核参数和网络问题。

    应用程序方面:应用程序方面、SQL语句性能、串行访问资源

    数据库方面的优化:内存、数据库结构、实例配置。

  数据库层面

    检查问题常用工具:

    1MySQL

    2msyqladmin:MySQL客户端,可进行管理操作

    3mysqlshow:功能强大的查看shell命令

    4show [SESSION | GLOBAL] variables:查看数据库参数信息

    5SHOW [SESSION | GLOBAL] STATUS:查看数据库的状态信息

    6information_schema:获取元数据的方法

    7SHOW ENGINE INNODB STATUS:Innodb引擎的所有状态

    8SHOW PROCESSLIST:查看当前所有连接session状态

    9explain:获取查询语句的执行计划

    10show index:查看表的索引信息

    11slow-log:记录慢查询语句

    12mysqldumpslow:分析slowlog文件的

优化数据库的查询的办法有:详细请看:(https://blog.csdn.net/weixin_33895475/article/details/85937491)

1、优化数据类型

MySQL中数据类型有多种

1.避免使用NULL

  NULL对于大多数数据库都需要特殊处理,MySQL也不例外,它需要更多的代码,更多的检查和特殊的索引逻辑,有些开发人员完全没有意识到,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默认值。

  (2)可能使用更小的字段

  MySQL从磁盘读取数据后是存储到内存中的,然后使用cpu周期和磁盘I/O读取它,这意味着越小的数据类型占用的空间越小,从磁盘读或打包到内存的效率都更好,但也不要太过执着减小数据类型,要是以后应用程序发生什么变化就没有空间了。修改表将需要重构,间接地可能引起代码的改变,这是很头疼的问题,因此需要找到一个平衡点。

2、小心字符集转换

  客户端或应用程序使用的字符集可能和表本身的字符集不一样,这需要MySQL在运行过程中隐含地进行转换,此外,要确定字符集如UTF-8是否支持多字节字符,因此它们需要更多的存储空间。

3、优化count(my_col)和count(*)

  如果你使用MyISAM表,在没有where子句的情况下使用count(*)速度是很快的,因为行数量的统计是非常精确的,因此MySQL不会一行一行地去找,进而得出行数,如my_col列没有空值,那么和前面说的情况会一样,即count(my_col)速度也会很快。

  如果有where子句时使用count( ),基本上就无法进行更多优化了,在where子句中超出了明显的索引列,对于复杂的where子句,只有使用覆盖索引才有用。

  除了上面的建议外,你还可以使用汇总表,它们让你可以对表的内容保持更新,你可以使用触发器,或者应用程序逻辑保持汇总表总是最新状态,或者定期运行一个批处理作业保持填充最新的数据信息,如果你采用后者,你的信息将会非常接近,但不是精确的,依赖于批处理作业多久运行一次,这需要权衡应用程序对精确信息的需要,和保持数据更新的系统开销,要在这二者之间找到一个平衡点。

 

4、优化子查询

  遇到子查询时,MySQL查询优化引擎并不是总是最有效的,这就是为什么经常将子查询转换为连接查询的原因了,优化器已经能够正确处理连接查询了,当然要注意的一点是,确保连接表(第二个表)的连接列是有索引的,在第一个表上MySQL通常会相对于第二个表的查询子集进行一次全表扫描,这是嵌套循环算法的一部分。

5、优化UNION

  在跨多个不同的数据库时使用UNION是一个有趣的优化方法,UNION从两个互不关联的表中返回数据,这就意味着不会出现重复的行,同时也必须对数据进行排序,我们知道排序是非常耗费资源的,特别是对大表的排序。

  UNION ALL可以大大加快速度,如果你已经知道你的数据不会包括重复行,或者你不在乎是否会出现重复的行,在这两种情况下使用UNION ALL更适合。此外,还可以在应用程序逻辑中采用某些方法避免出现重复的行,这样UNION ALL和UNION返回的结果都是一样的,但UNION ALL不会进行排序。

   

  MySQL数据库作为我们较为常用的关系型数据库来看还是较为方便易于使用的数据库,因此对于数据库的优化也是重中之重,随着上人们生活水平的提高,人们越来越需要效率更高的软件,所以不仅仅是对硬件的优化处理,还有对于软件的优化处理、对MySQL数据库的优化处理。 

 

原文地址:https://www.cnblogs.com/877612838zzx/p/11050727.html