本博文旨在结合本身看书理解,并借此图进行说明,若有谬误,望你们指正,以共同探讨为目的,交流学习。mysql
我主要从读、写、底层磁盘三方面进行阐述:sql
一、读操做:数据库
咱们知道数据在读取的时候,须要从磁盘读到内存中,而后再作相应的操做,而在优化读操做的时候,主要想buffer,cache这些进行优化:缓存
- key_buffer_size
- 这个对MyIsam表来讲是一个比较重要的参数,通常能够把他设置成内存的30%-40%,固然这还要根据具体状况,MyISAM表会使用操做系统的缓存来缓存数据,所以须要留出部份内存给它们,不少状况下数据比索引大多了。
- innodb_buffer_pool_size
- 这个对InnoDB来讲是一个比较重要的参数,而InnoDB对缓冲更为敏感,MyISAM能够在默认的 key_buffer_size 设置下运行的能够,然而Innodb在默认的 innodb_buffer_pool_size 设置下却跟蜗牛似的。因为Innodb把数据和索引都缓存起来,无需留给操做系统太多的内存,所以若是只须要用Innodb的话则能够设置它高达 70-80% 的可用内存。一些应用于 key_buffer 的规则有 — 若是你的数据量不大,而且不会暴增,那么无需把 innodb_buffer_pool_size 设置的太大了。
- table_cache
- 表的缓存,这个占用系统的资源和内存,由于每个现成都须要打开一个临时表,因此当链接数大的时候能够加大此值。
- thread-cache
- 线程的缓存,线程的建立和销毁开销可能会很大,因此每一个线程的链接和断开须要,若是程序中活跃的并发链接数和Thread-Created的值比较大,能够稍微设置大一点此值。
- query-cache
- 若是应用程序中有大量的读,能够设置大一点此值,可是也不要太大,由于维护它也须要很多的开销。通常设置32M-512M便可。
- sort_buffer_size
- 这个是connection级的参数,在每一个connection第一次须要使用这个buffer的时候,一次性分配设置的内存,此值不是越大越好,若是设置过大,碰上高并发的状况下就会使性能下降,sort_buffer_size 超过2KB的时候,就会使用mmap()而不是 malloc() 来进行内存分配,致使效率下降。
- mysql临时表 当工做在很是大的表上时,你可能偶尔须要运行不少查询得到一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,而后多这些表运行查询。 mysql服务器会自动建立内部临时表:该临时表能够是只存在于内存的memory临时表,或者是存储于硬盘的myisam临时表;并且初始建立的memory临时表因为表的增大可能会转变为myisam临时表——其转化临界点由max_heap_table_size和tmp_table_size系统变量的较小值决定的!注意:max_heap_table_size系统变量应用于全部的memory引擎的表,不论是用户临时表、正常表、或者内部临时表。固然程序也能够建立临时表:create temporary table XX; 固然这是程序控制,建立使用完后再删除,由程序控制了。
以上是读操做的一些介绍,接下来是写操做方面的。安全
二、写操做:服务器
写操做分为热门数据和普通数据,简而言之就是按照频繁程度进行划分的。然频繁修改的数据能够和非频繁的数据进行分开。架构
举个例子:并发
- 好比我网站天天PV 1000w,而在PV统计的表中,我每次访问就会插入一条数据,一天下来1000w,固然这还不多是分摊在24小时,就按照10个小时的中高峰期来讲,每一个小时也是100w条数据,若是个人网站其余表中的跟新的数据天天2w条,相对1000w来讲,就是太少了,可是这2w条数据有事比较重要的数据,若是是用户注册、客户购买商品下的订单,他可比记录PV信息更重要吧,这时候问题就出现了:个人热门数据到底是什么?是PV统计仍是订单、注册用户,不言而喻,固然其中一个仍是重点数据了,因此为了避免让记录PV的数据来影响更重要的数据的更新,咱们能够把他分开,若是后面还有主从同步的话,分开后,同步的负载也会下降不少,这样就能够只同步2w条数据,而不用考虑那1000w条数据了,进而主数据库的负载也会下降。
如今是把热门数据和普通数据分开了,可是对于高并发的数据库服务器来讲,如何抗并发,这到成了一个重要的问题,固然高配服务器,集群用上,包括Nosql也用上可一解决这样的问题,若是在设计的时候能使用队列机制,这样不就更好了嘛!(地铁上看到一句广告语:有序方能通畅!)ide
固然你可能有更好的方法,能够共同交流。高并发
三、底层磁盘规划:
- RAID0:
- 连续以位或字节为单位分割数据,并行读/写于多个磁盘上,所以具备很高的数据传输率,但它没有数据冗余,所以并不能算是真正的RAID结构。RAID0只是单纯地提升性能,并无为数据的可靠性提供保证,并且其中的一个磁盘失效将影响到全部数据。所以,RAID 0不能应用于数据安全性要求高的场合。
- RAID1:
- 它是经过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据。当原始数据繁忙时,可直接从镜像拷贝中读取数据,所以RAID1:
- 能够提升读取性能。RAID1是磁盘阵列中单位成本最高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统能够自动切换到镜像磁盘上读写,而不须要重组失效的数据。
- RAID0+1:
- 也被称为RAID10标准,实际是将RAID0和RAID1标准结合的产物,在连续地以位或字节为单位分割数据而且并行读/写多个磁盘的同时,为每一块磁盘做磁盘镜像进行冗余。它的优势是同时拥有RAID 0的超凡速度和RAID 1的数据高可靠性,可是CPU占用率一样也更高,并且磁盘的利用率比较低。
- RAID5:
- 不单独指定的奇偶盘,而是在全部磁盘上交叉地存取数据及奇偶校验信息。在RAID5上,读/写指针可同时对阵列设备进行操做,提供了更高的数据流量。RAID5更适合于小数据块和随机读写的数据。RAID3与RAID5相比,最主要的区别在于RAID3每进行一次数据传输就需涉及到全部的阵列盘;而对于RAID5来讲,大部分数据传输只对一块磁盘操做,并可进行并行操做。在RAID5中有“写损失”,即每一次写操做将产生四个实际的读/写操做,其中两次读旧的数据及奇偶信息,两次写新的数据及奇偶信息。
- RAID6:
- RADI6技术是在RAID5基础上,为了进一步增强数据保护而设计的一种RAID方式,其实是一种扩展RAID5等级。与RAID5的不一样之处于除了每一个硬盘上都有同级数据XOR校验区外,还有一个针对每一个数据块的XOR校验区。固然,当前盘数据块的校验数据不可能存在当前盘而是交错存储的,具体形式见图。这样一来,等于每一个数据块有了两个校验保护屏障(一个分层校验,一个是整体校验),所以RAID6的数据冗余性能至关好。可是,因为增长了一个校验,因此写入的效率较RAID5还差,并且控制系统的设计也更为复杂,第二块的校验区也减小了有效存储空间。
而对于热门数据可使用RAID10,这样他的性能和安全性会提升不少;而普通数据能够采用RAID5,主要提供安全性,像临时表这样的使用RAID0,在性能上发挥巨大的优点。
以上均我的看法,若有疑问,可共同交流学习!