zoukankan      html  css  js  c++  java
  • MYSQL性能调优

    摘要

    为了学习研究MySQL数据库在工作原理,深刻理解MySQL在企业运用时如何保证其高效运行。分别从表结构的优化,SQL语句的优化,存储引擎的选择,索引的优化以及现今MySQL的发展与其他企业级数据库的比较。介绍了从编码选择到数据类型的选择以及从整体的角度设计表结构。在SQL语句的选择和使用的介绍的时候,深入介绍了一些基本的使用原则以及在一般在使用过程中我们存在的误区以及如何解决这些问题。着重介绍了MySQL的几个存储引擎MyISAM、InnoDB和NDBCluster的差异以及各自的适用范围。有介绍了MySQL的索引的一些优化的建议以及高屋建瓴地阐述和比较了MySQL的优劣和发展态势。

     

    前言

    数据库作为应用作为广泛,地位极为重要的中间件应用,学习和使用数据库管理系统变得越来越重要。为了研究和总结对mysql数据库的学习结果,特别从数据表结构、sql语句优化、存储引擎的选择、索引的应用、以及mysql的比较总结对mysql技术做了一个比较全面升入的介绍。使用mysql的过程中,如何更好地使用与优化越来越重要,在这篇文章中就阐述。

    第一章 表结构的优化

    数据表是数据库的具体表现形式,设计优良的数据库拥有良好的表结构,者不单单指数据库的表需要满足范式结构,为了更有利于具体操作,表结构还需要实际的可扩展性,以便于做增删改查,又需要根据数据表的具体作用做出调节。在系统中被大量查询的表的结构的设计会对系统性能产生极大的影响。如果说系统的和核心是数据库的话,那么设计数据库的核心就是表结构的设计。

    1.1 编码的选择

    字符集直接决定了数据在MySQL中的存储编码方式,由于同样的内容使用不同字符集表示所占用的空间大小会有较大的差异,所以通过使用合适的字符集,可以帮助我们尽可能减少数据量,进而减少IO操作次数。不要使用UTF-8或其他UNICODE字符类型,这样可以节约大如果没有需要使用多语言,那么最好量的存储空间。

    比如中文就可以选择GBK或者GB2313,而GBK是对GB2313的扩展,选择的时候可视情况而定。

    1.2 表的拆分

    有些时候,我们可能会希望将一个完整的对象对应于一张数据库表,这对于应用程序开发来说是很有好的,但是有些时候可能会在性能上带来较大的问题。当我们的表中存在类似于TEXT或者是很大的VARCHAR类型的大字段的时候,如果我们大部分访问这张表的时候都不需要这个字段,我们就该义无反顾的将其拆分到另外的独立表中,以减少常用数据所占用的存储空间。这样做的一个明显好处就是每个数据块中可以存储的数据条数可以大大增加,既减少物理IO次数,也能大大提高内存中的缓存命中率。

    1.3 数据类型的选择

    数据库操作中最为耗时的操作就是IO处理。据统计,数据库操作90%以上的时间都花在了IO上面。所以尽可能减少IO量,可以在很大程度上提高数据库操作的性能。

    MySQL的数据类型可以精确到字段,所以当我们需要大型数据库中存放多字节数据的时候,可以通过对不同表不同字段使用不同的数据类型来较大程度减小数据存储量,进而降低IO操作次数并提高缓存命中率。数据类型选择的核心思想很简单,就是吝啬地选择所占空间最小的数据类型。

    下面的这些关于字段类型的优化建议主要适用于记录条数较多,数据量较大的场景,因为精细化的数据类型设置可能带来维护成本的提高,过度优化也可能会带来其他的问题:

    1.3.1 数字类型

    尽量不要使用DOUBLE,不仅仅只是存储长度的问题,同时还会存在精确性的问题。同样,固定精度的小数,也不建议使用DECIMAL,可以乘以固定倍数转换成整数存储,可以大大节省存储空间,且不会带来任何附加维护成本。对于整数的存储,在数据量较大的情况下,需要分开 TINYINT、INT和BIGINT的选择,因为三者所占用的存储空间也有很大的差别,能确定不会使用负数的字段,最好添加unsigned定义。

    1.3.2 字符类型

    尽量减少使用TEXT数据类型,因为它的性能要低于char或者是varchar类型的处理。定长字段,使用CHAR 类型,不定长字段使用VARCHAR,且仅仅设定适当的最大长度,而不是非常随意的给一个很大的最大长度限定,因为不同的长度范围,MySQL也会有不一样的存储处理。

    1.3.3 时间类型

    尽量使用TIMESTAMP类型,其存储空间只需要 DATETIME类型的一半。对于只需要精确到某一天的数据类型,建议使用DATE类型,因为他的存储空间只需要3个字节,比TIMESTAMP还少。

    1.3.4 ENUM & SET

    对于状态字段,使用 ENUM 来存放,因为可以极大的降低存储空间,而且即使需要增加新的类型,只要增加于末尾,修改结构也不需要重建表数据。如果是存放可预先定义的属

    性数据可以使用SET类型,即使存在多种属性,同样可以游刃有余,同时还可以节省不小的存储空间。

    1.3.5 LOB类型

    尽量不要数据库中存放 LOB 类型数据,对于这类大的数据类型,还是使用文件形式存储。

    1.4 适度冗余

    以join操作为例,mysql每次join都会有一定的性能的要求,如果该操作需要大量的进行而所取到又是独立的小字段,在这种情况下将该字段合并在一张表内能够大大地降低IO,提高效率。不过,冗余的同时需要确保数据的一致性不会遭到破坏,确保更新的同时冗余字段也被更新。

    另外就是NULL了,如果是一个组合索引,那么这个NULL类型的字段会极大影响整个索引的效率。此外NULL在索引中的处理也是特殊的,也会占用额外的存放空间。很多人觉得 NULL 会节省一些空间,所以尽量让NULL来达到节省IO的目的,但是大部分时候这会适得其反,虽然空间上可能确实有一定节省,倒是带来了很多其他的优化问题,不但没有将IO量省下来,反而加大了SQL的IO量。所以尽量确保默认值值不是 NULL,也是一个很好的表结构设计优化习惯。

    第二章 SQL语句的优化

    在进行SQL优化的时候,我们必须明确目的,也就是减少IO次数。

    IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是IO操作所占用的,减少IO次数是SQL优化中需要第一优先考虑。当然,也是收效最明显的优化手段。另外就是降低CPU计算了,除了IO瓶颈之外,SQL优化中需要考虑的就是CPU运算量的优化了。order by, group by,distinct…都是最消耗CPU的,因为这些操作基本上都是CPU处理内存中的数据比较运算。当我们的IO优化做到一定阶段之后,降低CPU计算也就成为了我们SQL优化的重要目标。

    2.1 SQL优化原则

    一般情况下,写好SQL语句首先需要一个良好的思路,如何将几张有用的表通过一个清晰的关系连接起来。往往思路越清晰得到的SQL的性能也就越好,要是本来简单的关系通过绕了一圈得到了一个结果,可想而知计算机处理的时候也就要绕一大圈,自然降低了执行的性能。

    2.1.1 尽量少join

    MySQL的优势在于简单,但这在某些方面其实也是其劣势。MySQL优化器效率高,但是由于其统计信息的量有限,优化器工作过程出现偏差的可能性也就更多。对于复杂的多表Join,一方面由于其优化器受限,再者在Join这方面所下的功夫还不够,所以性能表现离Oracle等关系型数据库前辈还是有一定距离。但如果是简单的单表查询,这一差距就会极小甚至在有些场景下要优于这些数据库前辈。

    2.1.2 尽量少排序

    排序操作会消耗较多的CPU资源,所以减少排序可以在缓存命中率高等IO能力足够的场景下会较大影响SQL的响应时间。对于MySQL来说,减少排序有多种办法,比如:通过利用索引来排序的方式进行优化,减少参与排序的记录条数,非必要不对数据进行排序.

    2.1.3 尽量避免select *

    一方面select *的性能不好,显而易,它比select xx,yy from tt多花费的是获得表中各属性的性能。例外,我们在查询一张表获取一组数据的时候,大多数的时候并不需要这张表中的所有项,这时候简单地使用select *就会造成获得冗余的数据和浪费额外的IO。

    2.1.4 尽量用join代替子查询

    我们刚才讲到尽量少使用join,但是join在有的时候是必须要使用的,特别是几张表一起处理的时候。而相对于join,子查询更加消耗性能。这个也很容易理解,因为子查询的时候会在内存中内子查询的结果生成一张表然后再经过父查询得出最终结构,相当于经历了多次查询而且浪费了一定的内存空间。

    2.1.5 尽量少 or

    因为很多时候使用 union all 或者是union(必要的时候)的方式来代替“or”会得到更好的效果。

    2.1.6 尽量用 union all 代替 union

    union 和 union all 的差异主要是前者需要将两个(或者多个)结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。所以当我们可以确认不可能出现重复结果集或者不在乎重复结果集的时候,尽量使用 union all 而不是 union。

    2.1.7 尽量早过滤

    这一优化策略其实最常见于索引的优化设计中,将过滤性更好的字段放得更靠前。在SQL编写中同样可以使用这一原则来优化一些Join的SQL。比如我们在多个表进行分页数据查询的时候,我们最好是能够在一个表上先过滤好数据分好页,然后再用分好页的结果集与另外的表 Join,这样可以尽可能多的减少不必要的 IO 操作,大大节省 IO 操作所消耗的时间。

    2.1.8 避免类型转换

    这里所说的“类型转换”是指 where 子句中出现 column 字段的类型和传入的参数类型不一致的时候发生的类型转换:

    人为在column_name 上通过转换函数进行转换,直接导致 MySQL(实际上其他数据库也会有同样的问题)无法使用索引,如果非要转换,应该在传入的参数上进行转换,由数据库自己进行转换如果我们传入的数据类型和字段类型不一致,同时我们又没有做任何类型转换处理,MySQL可能会自己对我们的数据进行类型转换操作,也可能不进行处理而交由存储引擎去处理,这样一来,就会出现索引无法使用的情况而造成执行计划问题。

    2.1.9 优先优化高并发的 SQL

    对于破坏性来说,高并发的 SQL 总是会比低频率的来得大,因为高并发的 SQL 一旦出现问题,甚至不会给我们任何喘息的机会就会将系统压跨。而对于一些虽然需要消耗大量IO而且响应很慢的SQL,由于频率低,即使遇到,最多就是让整个系统响应慢一点,但至少可能撑一会儿,让我们有缓冲的机会。

    2.1.10 从全局出发优化,而不是片面调整

    SQL 优化不能是单独针对某一个进行,而应充分考虑系统中所有的SQL,尤其是在通过调整索引优化SQL的执行计划的时候,千万不能顾此失彼,因小失大。尽可能对每一条运行在数据库中的SQL进行explain。优化 SQL,需要做到心中有数,知道 SQL的执行计划才能判断是否有优化余地,才能判断是否存在执行计划问题。在对数据库中运行的 SQL 进行了一段时间的优化之后,很明显的问题 SQL 可能已经很少了,大多都需要去发掘,这时候就需要进行大量的 explain 操作收集执行计划,并判断是否需要进行优化。

    2.2 SQL优化误区

    在我们生活中有很多我们想当然的事情,但是事实却正好相反。在SQL优化的过程中也有这样的误区。

    2.2.1 关于count() 的一些误区

    通常我们会认为count(1)和count(primary_key)要优于 count(*)。

    很多人为了统计记录条数,就使用 count(1) 和 count(primary_key) 而不是 count(*) ,他们认为这样性能更好,其实这是一个误区。对于有些场景,这样做可能性能会更差,因为数据库对 count(*) 计数操作做了一些特别的优化。

    但是count(column) 和 count(*) 是一样的吗?

    这个误区甚至在很多的资深工程师或者是 DBA 中都普遍存在,很多人都会认为这是理所当然的。实际上,count(column)和 count(*) 是一个完全不一样的操作,所代表的意义也完全不一样。

    count(column) 是表示结果集中有多少个column字段不为空的记录。

    count(*) 是表示整个结果集有多少条记录。

    2.2.2 关于select 的一些误区

    同样一般我们会认为select a,b from … 比 select a,b,c from … 可以让数据库访问更少的数据量,因而效率会更高。

    这个误区主要存在于大量的开发人员中,主要原因是对数据库的存储原理不是太了解。

    实际上,大多数关系型数据库都是按照行(row)的方式存储,而数据存取操作都是以一个固定大小的IO单元(被称作 block 或者 page)为单位,一般为4KB,8KB… 大多数时候,每个IO单元中存储了多行,每行都是存储了该行的所有字段(lob等特殊类型字段除外)。

    所以,我们是取一个字段还是多个字段,实际上数据库在表中需要访问的数据量其实是一样的。

    当然,也有例外情况,那就是我们的这个查询在索引中就可以完成,也就是说当只取 a,b两个字段的时候,不需要回表,而c这个字段不在使用的索引中,需要回表取得其数据。在这样的情况下,二者的IO量会有较大差异。

    2.2.1 使用order by一定需要排序操作?

    我们知道索引数据实际上是有序的,如果我们需要的数据和某个索引的顺序一致,而且我们的查询又通过这个索引来执行,那么数据库一般会省略排序操作,而直接将数据返回,因为数据库知道数据已经满足我们的排序需求了。

    实际上,利用索引来优化有排序需求的 SQL,是一个非常重要的优化手段。

    第三章 存储引擎的优化

    MySQL的存储引擎是关系型数据库产品中最具有特色的了,不仅可以同时使用多种存储引擎,而且每种存储引擎和MySQL之间使用插件方式这种非常松的耦合关系。在应对不同场景的处理的时候,选择不同的存储引擎能够有效地提高存储效率。

    3.1 MyISAM

    3.1.1 MyISAM的特性

    MyISAM存储引擎不支持事务,所以对事务有要求的业务场景不能使用。其锁定机制是表级索引,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能。

    不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。MyISAM可以通过key_buffer缓存以大大提高访问性能减少磁盘IO,但是这个缓存区只会缓存索引,而不会缓存数据。

    3.1.2 MyISAM的适用性

    MyISAM适用于不需要事务支持、并发性相对较低、数据修改相对较少的场景下。一般这类的系统会以读为主,对数据一致性要求不是很高。

    在使用该引擎的时候,可以尽量利用其缓存机制使用索引。并且调整读写的优先级,根据实际需求确保重要操作更优先。在必要的时候启用延迟插入改善大批量写入性能。在进行插入操作的时候尽量顺序操作让insert数据都写入到尾部,减少阻塞。同时,分解大的操作,降低单个操作的阻塞时间。并注意降低并发数,某些高并发场景通过应用来进行排队机制。处理相对静态的数据时,充分利用Query Cache可以极大的提高访问效率。另外,MyISAM的Count只有在全表扫描的时候特别高效,带有其他条件的count都需要进行实际的数据访问。

    3.2 InnoDB

    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 MySQL与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 MySQL与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也不得不在功能方面做出大量的努力,以不断满足客户的新需求。

  • 相关阅读:
    HDU.5765.Bonds(DP 高维前缀和)
    SPOJ.TLE
    LOJ.2585.[APIO2018]新家(二分 线段树 堆)
    BZOJ.2679.Balanced Cow Subsets(meet in the middle)
    BZOJ.3293.[CQOI2011]分金币(思路)
    BZOJ.4558.[JLOI2016]方(计数 容斥)
    BZOJ.3631.[JLOI2014]松鼠的新家(树上差分)
    BZOJ.1568.[JSOI2008]Blue Mary开公司(李超线段树)
    BZOJ.1071.[SCOI2007]组队(思路)
    BZOJ.4910.[SDOI2017]苹果树(树形依赖背包 DP 单调队列)
  • 原文地址:https://www.cnblogs.com/imysql/p/7060217.html
Copyright © 2011-2022 走看看