千万级MySQL数据库建立索引,提高性能的秘诀( 二 )

  • 表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用 。
  • 需要把数据存放到多个数据库中,提高系统的总体可用性(分库,鸡蛋不能放在同一个篮子里) 。
  •  
    系统配置的优化
    操作系统配置的优化:增加TCP支持的队列数
    mysql配置文件优化:Innodb缓存池设置(innodb_buffer_pool_size,推荐总内存的75%)和缓存池的个数(innodb_buffer_pool_instances)
     
    硬件的优化
    CPU:核心数多并且主频高的 内存:增大内存 磁盘配置和选择:磁盘性能
     
    MySQL中的悲观锁与乐观锁的实现
    悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念 。
     
    悲观锁
    悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为所有的操作均会导致并发安全问题,因此要先确保获取锁成功再进行业务操作 。通常来讲,在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select … for update操作来实现悲观锁 。当数据库执行select … for update时会获取被select中的数据行的行锁,因此其他并发执行的select … for update如果试图选中同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果 。select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用 。这里需要特别注意的是,不同的数据库对select… for update的实现和支持都是有所区别的,例如oracle支持select for update no wait,表示如果拿不到锁立刻报错,而不是等待,mysql就没有no wait这个选项 。另外,mysql还有个问题是: select… for update语句执行中所有扫描过的行都会被锁上,这一点很容易造成问题 。因此,如果在mysql中用悲观锁务必要确定使用了索引,而不是全表扫描 。
     
    乐观锁
    乐观锁的特点先进行业务操作,只在最后实际更新数据时进行检查数据是否被更新过,若未被更新过,则更新成功;否则,失败重试 。乐观锁在数据库上的实现完全是逻辑的,不需要数据库提供特殊的支持 。一般的做法是在需要锁的数据上增加一个版本号或者时间戳,然后按照如下方式实现:
    【千万级MySQL数据库建立索引,提高性能的秘诀】SELECT data AS old_data, version AS old_version FROM …;//根据获取的数据进行业务操作,得到new_data和new_versionUPDATE SET data = https://www.isolves.com/it/sjk/MYSQL/2019-11-26/new_data, version = new_version WHERE version = old_versionif (updated row > 0) {// 乐观锁获取成功,操作完成} else {// 乐观锁获取失败,回滚并重试}乐观锁是否在事务中其实都是无所谓的,其底层机制是这样:在数据库内部update同一行的时候是不允许并发的,即数据库每次执行一条update语句时会获取被update行的写锁,直到这一行被成功更新后才释放 。因此在业务操作进行前获取需要锁的数据的当前版本号,然后实际更新数据时再次对比版本号确认与之前获取的相同,并更新版本号,即可确认这其间没有发生并发的修改 。如果更新失败,即可认为老版本的数据已经被并发修改掉而不存在了,此时认为获取锁失败,需要回滚整个业务操作并可根据需要重试整个过程 。
     
    悲观锁与乐观锁的应用场景
    一般情况下,读多写少更适合用乐观锁,读少写多更适合用悲观锁 。乐观锁在不发生取锁失败的情况下开销比悲观锁小,但是一旦发生失败回滚开销则比较大,因此适合用在取锁失败概率比较小的场景,可以提升系统并发性能 。
     
    MySQL存储引擎中的MyISAM和InnoDB区别详解
    在MySQL 5.5之前,MyISAM是mysql的默认数据库引擎,其由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良 。虽然MyISAM性能极佳,但却有一个显著的缺点: 不支持事务处理 。不过,MySQL也导入了另一种数据库引擎InnoDB,以强化参考完整性与并发违规处理机制,后来就逐渐取代MyISAM 。
    InnoDB是MySQL的数据库引擎之一,其由Innobase oy公司所开发,2006年五月由甲骨文公司并购 。与传统的ISAM、MyISAM相比,InnoDB的最大特色就是支持ACID兼容的事务功能,类似于PostgreSQL 。目前InnoDB采用双轨制授权,一是GPL授权,另一是专有软件授权 。具体地,MyISAM与InnoDB作为MySQL的两大存储引擎的差异主要包括:
    存储结构:每个MyISAM在磁盘上存储成三个文件:第一个文件的名字以表的名字开始,扩展名指出文件类型 。.frm文件存储表定义,数据文件的扩展名为.MYD (MYData),索引文件的扩展名是.MYI (MYIndex) 。InnoDB所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB 。


    推荐阅读