MySQL架构

3 篇文章 0 订阅
在PHP程序中,性能往往是耗在数据库上,因此对MySQL的深入学习尤为重要。

1、连接管理
     每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这单独的线程中执行,该线程轮流在某个CPU核心或者CPU上运行。

2、优化与执行
     首先是解析查询,并在内部创建数据结构,然后进行各种优化,包括重写查询、决定表的读取顺序、选择合适索引等。你可以请求优化器解释(explain)优化过程的信息,对于select查询之前,服务器会先检查查询缓存(Query Cache),因为在内存的速度比磁盘快得多,缓存可以跳过解析和优化的操作从而大幅提高查询性能。
      Cache Query 原理:
          客户端的select语句通过一定的hash算法进行计算,存放在hash桶中,并对结果集存放在内存中,存放query hash值的链表中存放了hash值和结果集的内存地址和query涉及的所有table的标识等信息。前端的sql过来会先进行hash计算,如果能够在cache中找到,就直接从内存中取出结果返回给前端,如果没有则mysql解析器会对sql进行解析并且优化。注意查询cache是在sql解析器前执行的,所有速度非常快,因为又省去了一个操作。当后端任何一个表的一条数据,索引,结构发生变化时,就会将与此表关联的query chache失效,并且释放内存。所以对于数据变化频繁的sql就不要cache了。那样不但不会提高性能还能得到相反的结果,因为每次多了查询缓存的操作。

3、并发控制
     只要有多个查询需要在同一时间修改数据,都会产生并发成本控制问题。
      a、读写锁
          读锁是共享的,是相互不阻塞的,多个客户端同一时间读取同一资源互不干扰。写锁是排他锁,即一个写锁会阻塞其他的写锁和读锁,只有这样才能保证一个用户能执行写入,并防止其他用户读取正在写入的资源。
     b、锁粒度
          在给定的资源上,锁定的数据量越少,则系统并发程序越高,因为锁的操作,包括获得锁,检测锁,释放锁都会增加系统开销。
          1)、表锁
               表锁可以减少锁的数量,因为在锁的性能消耗是最小的,当有对表进行写操作(insert/delete/update等)前,需要先获取写锁,这样会阻塞其它用户对该表的读写操作,写锁的优化级比读高,因此它会插队到读锁前面,反之读锁不能插队到写锁前面。在并发不太大,或者涉及写操作较少时采用表锁具有良好的性能。MyISAM存储引擎就是采用的表锁。
          2)、行级锁
               行级锁最大程序上的支持了并发的处理,当然更多的锁也带来了更多的开销。InnoDB存储引擎就是采用的行级锁。
     死锁:指两个或多个进程在执行过程中因争夺资源而造成互相等待的现象,表锁不会产生死锁,所以主要还是学发生在Innode上,临时解决办法是show processlist 找到死锁进程号kill掉。

4、存储引擎
     在文件系统中,MySQL将每个数据库保存为数据目录下的一个子目录中,创建表时会在子目录中创建一个和表名相同的.frm文件保存表的定义。、
     a、InnoDB
          InnoDB是MySQL的默认引擎,它的性能和自动恢复特性,使用它在非事务存储中也很流行。它采用了MVCC来支持高并发,它并不一定是行级锁,如果使用了update..where xx like 'xxx%'等它不知道有多少行时会采用表级锁。
     b、MyISAM
          在5.1以前它是默认引擎。MyISAM引擎设计简单,数据以紧密格式存储,它提供了大量的特性,包括全文索引(5.6的Innode也支持了)、压缩、空间函数等,但它不支持事件和行级锁,而且崩溃后无法安全恢复,尽管是这样但是绝不是一无是处,对于只读的数据、或表数据较小,可以忍受不能恢复操作,则依然可以使用它,MyISAM最典型的性能问题还是表锁问题,如果你发现查询一直处理Locked状态,毫无疑问表锁是罪魁祸首。
          压缩:如果表创建好并导入数据后,不会再进行修改,那么这样的表或许适合采用MyISAM压缩表,当要修改时应该先解压再修改再压缩,压缩表可以极大减少磁盘空间占用,因此可以减少磁盘I/O,从而提升查询性能。
          MyISAM不会保证将数据安全写到磁盘中,许多用户并不知道这个特点的风险,MyISAM只将数据写到内在中,然后等待操作系统定期将数据刷出到磁盘中,为了模拟该风险,在真实环境中,突然关机,你会发现有些数据并没有写入。

5、其他引擎
     archive、blackhole、csv、federated、memory(放在内存中,重启后结构还在但数据会丢失,它是表级锁)、merge(是MyISAM的一个变种,它是由多个MyISAM表合并而来的虚表,在引入分区后该引擎已经被废除)、NDB。
    
6、第三方引擎
     OLTP、Infobright、Aria、Groonga、OQGraph、Q4M、SphinxSE、Spider

7、选择更合适的引擎
     这里只说下简单的选择准则,具体应用要具体分析,不要轻易相信MyISAM比InnoDB快之类的经验之谈。
     a、事务
          如果应用需要支持事务,那么InnoDB是目前最稳定并通过验证的选择;如果不需要事务,并且主要是SELECT和INSERT操作,那么MyISAM是最不错的选择。
     b、备份
          如果需要在线热备份,那么你应该选择InnoDB。
     c、崩溃恢复
          数据量比较大的时候,系统崩溃后快速恢复是一个需要考量的问题,相对来说MyISAM崩溃后发生损坏的概率比InnoDB要高得多,而且恢复速度也比较慢。
          

      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值