缓存机制使用索引。并且调整读写的优先级,根据实际需求确保重要操作更优先。在必要的时候启用延迟插入改善大批量写入性能。在进行插入操作的时候尽量顺序操作让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则是一个保守闭