好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

MYSQL性能调优--我当年的学年论文

3.2.1 InnoDB的特性

相对于MyISAM,InnoDB完全支持4个事务隔离级别,并支持多版本读。通过索引实现了行级锁定,但全表扫描仍然会是表锁,使用的时候注意间隙锁的影响。并且读写阻塞与事务隔离级别相关。具有非常高效的缓存特性:能缓存索引,也能缓存数据。整个表和主键以Cluster方式存储,组成一颗平衡树。所有Secondary Index都会保存主键信息。

3.2.2 InnoDB的适用性

InnoDB具有较好的事务特性,也就是需要事务支持。其行级锁定机制对高并发有很好的适应能力,但需要确保查询是通过索引完成。能够很好地适用于数据更新较为频繁的场景,但是对数据一致性要求较高。如果硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘 IO。

使用InnoDB需要注意主键尽可能小,避免给Secondary index带来过大的空间负担;避免全表扫描,因为会使用表锁;尽可能缓存所有的索引和数据,提高响应速度;在大批量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交;合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性;避免主键更新,因为这会带来大量的数据移动。

3.3 NDBCluster

3.3.1 NDBCluster 的特性

NDBCluster 对 mysql 的重要的贡献就是将分布式的概念引人了进来。作为 分布式存储引擎,可以由多个NDBCluster存储引擎组成集群分别存放整体数据的一部分。 NDBCluster 和Innodb一样,也支持事务。可与mysqld不在一台主机,也就是可以和mysqld分开存在于独立的主机上,然后通过网络和mysqld通信交互。但是内存需求量巨大,索引以及被索引的数据必须存放在内存中。

3.3.2 NDBCluster 的适用性

    NDBCluster 具有非常高的并发需求,对单个请求的响应并不是非常的及时。查询简单,过滤条件较为固定,每次请求数据量较少,又不希望自己进行水平分片。

在使用的时候尽可能让查询简单,避免数据的跨节点传输;尽可能满足SQL节点的计算性能,大一点的集群SQL节点会明显多余Data节点。在各节点之间尽可能使用万兆网络环境互联,以减少数据在网络层传输过程中的延时。

  

第四章 MySQL索引的优化

索引是数据库中常用来提高性能的的技术,如何用好索引成为数据库实现性能最大化的很重要的一方面。

4.1 索引的概述

如何进行高质量的SQL编程,对索引的理解使用是关键的。正确地使用索引可以是SQL语句运行得更快,而错误的添加索引可能会带来灾难性的结果。

4.2 索引设计的原则

索引的设计可以遵循一些已有的原则,创建索引的时候先尽量考虑符合这些规则,便于提升索引的使用效率,更好更高效地使用索引。

搜索的索引列,不一定是所要选择的列。换句话说,适合索引的列是出现在WHERE子语句中的列,或连接句中指定的列,而不是出现在SELECT关键字后的选择列表中的列。

使用唯一的索引。考虑到类中值的分布。索引的列的基数越大,索引的效果越好。例如,存放出生日期的列具有不同的值,很容易区分各行。而用来记录性别的列,只含有“M”和“F”,则对此列进行索引没有多大的用处,因为不管搜索到哪个值,都会得出一个大约一半的行。使用短索引。

如果对字符串列进行索引,应该指定一个前缀的长度,只要有可能就应该这样做。例如有一个CHAR(100)的列,如果前10或20 个CHAR内,多项值是唯一的,那么就不要对整个列进行索引了。对前10货20个CHAR的索引可以节约大量的缩影空间,也可能使查询更快。而且较小的索引进行的IO更少,更短的值比起来消耗的CPU运算更少。更为重要的是对于更短的键值,索引高速缓存中的块能够容纳更多地键值,因此内存中也就能放更对的值。这样就增加了找到行而不是读取索引中较多块的可能。

利用最左前缀。在创建了n列索引是也就是创建了n个索引。多列索引可以起到几个索引的作用。因为可以利用索引中最左的列集来匹配,也就是最左前缀。

不要过度使用索引。任何事物物极必反都是其固定的哲学定律。对于索引也是一样。每个索引都会占有一定得磁盘空间降低读写操作的性能。在修改表的过程中索引必须重建或更新。也就是索引越多所需要花费的时间久更长。因此在创建索引的时候需要控制好索引的对象,不能盲目的添加随意。

第五章 MySQL的发展与比较

5.1 My SQL 与 Oracle 的比较

实际上在 Oracle 收购了 sun 之后 MySQL 一并变成了 Oracle 的一款产品,对于 Oracle 与 MySQL 的比较也就是相当与 Oracle 公司内部不同部门的比较,以及不同部门选择的技术与策略的比较。其实 MySQL 的发展也越来越像是一个简版的 Oracle 。

1 、组函数的用法规则:

    MySql 中组函数在 select 语句中可以随意使用,但 Oracle 中如果查询语句中有组函数,那其他列名必须是组函数处理过的,或者 groupby 子句中的列,负则会报错。

    2 、自动增长的数据类型处理:

    MySql 有自动增长数据类 (auto_increment) ,插入记录是不用操作此字段,会自动获得数据值, Oracle 中没有自动增长数据类型,需要使用 Sequence 序列号。

    3 、单引号的处理:

    MySql 里可以用双引号包其字符串, Oracle 只可以用单引号。

    4 、翻页的 sql 语句处理:

    MySql 翻页的语句比较简单,用 Limit 开始位置,记录个数, Oracle 处理翻页的 sql 语句比较繁琐,需要借助于 NUMROW 。

    5 、日期处理:

    MySql 日期字段分 Date 和 time 两种, Oracle 日期字段只有 Date ,包含年月日时分秒 MySql 存储当前时间用 now(),Oracle 用 sysdate ,或者将字符串转换成日期的函数 TO_DATE(‘2001-08-01’,’YYYY-MM-DD’) 。

    6 、空字符的处理

    MYSQL 的非空字段也有空的内容, ORACLE 里定义了非空字段就不容许有空的内容。按 MYSQL 的 NOT NULL 来定义 ORACLE 表结构,导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为 NULL 或空字符,需要把它改成一个空格的字符串。

    8. 字符串的模糊比较

    MYSQL 里用字段名 like%‘ 字符串 %’ , ORACLE 里也可以用字段名 like%‘ 字符串 %’ 但这种方法不能使用索引,速度不快,用字符串比较函数 instr( 字段名, ‘ 字符串 ’)>0 会得到更精确的查找结果。

5.2 My SQL 与 SQL Server 的比较

可以说两者最重要的区别是 MySql 是一个开发开源的系统,而 SQLServer 则是一个保守闭源的数据库系统。 SQLServer 服务器的狭隘的,保守的存储引擎与 MySQL 服务器的可扩展,开放的存储引擎绝然不同。虽然 SQLServer 也有 sybase 引擎,但 MySQL 能够提供更多种的选择,如 myisam, heap,innodb,and berkeley db 。但 MySQL 不完全支持陌生的关键词,所以它比 SQLServer 服务器要少一些相关的数据库。同时, MySQL 也缺乏一些存储程序的功能,比如 myisam 引擎联支持交换功能。
    纯粹就性能而言, MySQL 是相当出色的,因为它包含一个缺省桌面格式 myisam 。 myisam 数据库与磁盘非常地兼容而不占用过多的 cpu 和内存。 MySQL 可以运行于 windows 系统而不会发生冲突,在 unix 或类似 unix 系统上运行则更好。你还可以通过使用 64 位处理器来获取额外的一些性能。因为 MySQL 在内部里很多时候都使用 64 位的整数处理。这事很多知名网站都使用 MySQL 作为后台数据库。
    当提及软件的性能, SQLServer 服务器的稳定性要比它的竞争对手强很多。但是,这些特性也要付出代价的。比如,必须增加额外复杂操作,磁盘存储,内存损耗等等。
    MySQL 有一个用于改变数据的二进制日志。因为它是二进制,这一日志能够快速地从主机上复制数据到客户机上。即使服务器崩溃,这一二进制日志也会保持完整,而且复制的部分也不会受到损坏。在 SQLServer 服务器中,你也可以记录 SQLServer 的有关查询,但这需要付出很高的代价。
    这两个产品都有自己完整的安全机制。只要你遵循这些安全机制,一般程序都不会出现什么问题。
    恢复性也是 MySQL 的一个特点,这主要表现在 myisam 配置中。这种方式有它固有的缺欠,如果你不慎损坏数据库,结果可能会导致所有的数据丢失。然而,对于 SQLServer 服务器而言就表现得很稳键。 SQLServer 服务器能够时刻监测数据交换点并能够把数据库损坏的过程保存下来。
    对于这两种数据库,如果非要让我说出到底哪一种更加出色,也许我会让你失望。以我的观点,任一对你的工作有帮助的数据库都是很好的数据库,没有哪一个数据库是绝对的出色,也没有哪一个数据库是绝对的差劲。我想要告诉你的是你应该多从你自己的需要出发,即你要完成什么样的任务?而不要单纯地从软件的功能出发。
如果你想建立一个 .net 服务器体系,这一体系可以从多个不同平台访问数据,参与数据库的管理,那么你可以选用 SQLServer 服务器。如果你想建立一个第三方站点,这一站点可以从一些客户端读取数据,那么 MySQL 将是最好的选择。

5.3 MySQL的发展

学习一门技术,始终会去想这门技术今后的发展前景是怎么样的,未来时候还能够有活力的存在。 作为一个成熟的数据库管理系统,要满足各种各样的商业需求,功能肯定是会被列入重点参考对象的。 MySQL 的早期版本功能非常简单,只能做一些很基础的结构化数据存取操作,但是经过多年的改进和完善之后,现在它已经基本具备了所有通用数据库管理系统需要的相关功能。

虽然在功能方面 MySQL 数据库作为一个通用的数据库管理系统暂时还无法和 PostgreSQL 相比,但是其功能完全可以满足我们的通用商业需求,提供足够强大的服务。而且不管是哪一种数据库在功能方面都不敢声称自己比其他任何一款商用数据库管理系统都强,甚至都不敢声称能够拥有某类数据库产品的所有功能。因为每一款数据库管理系统都有自身的优势,也有自身的局限,这都说明每一款产品重点服务的方向不一样。

性能高一直是 MySQL 引以自豪的一个特点。在权威的第三方评测机构多次测试比较各种数据库 TPCC 值的过程中, MySQL 一直都有非常优异的表现,而且在其他所有商用的通用数据库管理系统中,仅仅有 Oracle 数据库能够与其一较高下。

MySQL 一直以来奉行一个原则,那就是在保证足够稳定性的前提下,尽可能地提高自身的处理能力。也就是说,在性能和功能方面, MySQL 第一考虑的要素主要还是性能, MySQL 希望能够在满足客户 99% 的需求的前提下,将剩余的所有精力都用来努力提高系统性能,而不希望自己是一个比其他任何数据库的功能都要强大的产品。

总体来说, MySQL 数据库在发展过程中一直追求三项原则:简单、高效、可靠。从上面简单的比较重也可以看出, MySQL 在这三项原则上面,没有哪一项是做的不好的。而且,虽然功能并不是 MySQL 自身追求的原则之一,但是考虑到当前用户量急剧增长,用户需求越来越多样化, MySQL 也不得不在功能方面做出大量的努力,以不断满足客户的新需求。

 

结论  

随着IT技术的发展,数据库技术依然没有改变其核心的功能,即使是各种NOSQL不断涌现的今天,MySQL这类的关系型数据库还是拥有着重要的地位。学好MySQL这类的开源数据库系统进一步可深入探索行业发展的本质,退一步也可以利用MySQL这个平台提高自己的技术。本文所介绍的MySQL的一些基本知识可能只是冰山一角,在技术不断发展的今天对MySQL的研究还会不断地深入。特别是国内,在阿里巴巴发动的“去IOE”的大潮下,对开源系统的推动越来越大,作为数据库领域开源系统的头牌,对MySQL的深度定制便成为各大互联网巨头的一个研究方向。

 

MYSQL性能调优--我当年的学年论文

标签:mysql   数据库   性能调优   存储引擎   sql   

查看更多关于MYSQL性能调优--我当年的学年论文的详细内容...

  阅读:35次