前在前面
Oracle后台服务及用户服务都是采用进程的形式存在,MySQL则是采用单进程多线程的形式,两种形式优势劣势在哪里?MySQL号称是基于磁盘数据库中CPU效率最高的数据库,这又为是为什么?这里为你揭晓。
关于线程与进程:
线程通常用Thread表示,进程通常用Process来表示。线程是指进程内的一个执行单元,也是进程内的可调度实体。
线程与进程的主要区别:
1、地址空间:进程是一个执行单元,它有自己独立的地址空间。进程内至少有一个线程,这些线程共享进程的地址空间。
2、资源拥有:进程是资源分配和拥有的单位,每发起一个进程都需要为期单为分析系统资源,但同一个进程内的线程则共享进程的资源。
3、线程是处理器调度的基本单位,不可再分。进程则还可以分发为多个线程。.
4、二者均可并发执行.。
Oracle进程:
在Oracle数据库启动时,系统就会为其分配大量的后台进程以提供专门的服务。如CKPT、PMON、SMON、DBWRn等,他们在数据库运行过程中,各负其责,通过内部机制进行通信,确保各自正常工作。在服务过程中,当监听器接收到外部的服务请求以后,由相关进程对其分析对应的服务进程。可以看到,在Oracle数据库中,最小的服务粒度就是进程。
InnoDB线程:
与Oracle有多个固定的后台进程不同,MySQL是单进程多线程数据库。在后台,可以看到MySQL一般有两个进程,一个是工作进程,一个是守护进程。
ps -ef | grep -i mysql
mysql 6676 1 0 04:25 pts/2 00:00:00 /bin/sh /u01/mysql/bin/mysqld_safe --datadir=/msdata/datas --pid-file=/msdata/datas/hidatas1.pid
mysql 6814 6676 0 04:25 pts/2 00:00:00 /u01/mysql/bin/mysqld --basedir=/u01/mysql --datadir=/msdata/datas --plugin-dir=/u01/mysql/lib/plugin --log-error=/msdata/datas/hidatas1.err --pid-file=/msdata/datas/hidatas1.pid --socket=/var/lib/mysql/mysql.sock
守护进程的目的是在工作进程发生异常时,自动重新调用一个进程,以保证数据库可以持续的运行。当时,只运行一个工作进程数据库也可以正常运行。
进程与线程的效率之争:
从效率来讲,MySQL因为是单进程多线程,其维护线程所需要的系统资源显然更低,线程之间进行上下文信息交换的效率也更高。而Oracle的进程之间虽然各司其责,但相互之间亦需要协调。与线程相比,进程之间的协调必定更耗资源。通过这一点,不难看出,MySQL在CPU的执行效率上更胜一筹,这也是MySQL号称是基于磁盘数据库中CPU效率最高的数据库的原因了。
从稳定性上讲,如果因为操作系统或其它方面的原因,导致进程发生异常。如僵尸进程,则极容易使数据库也发生异常情况,在这种情况下,Oracle环境下,通常需要DBA通过Kill进程的方式重启进程,除CKPT、PMON等几个关键进程不能Kill以外,其它大部分进程被Kill掉,也不会对数据库造成什么影响。而对于MySQL来说,则于只有一个进程,显然Kill掉该进程会使数据库整体重启,则必然对系统的高可用性造成影响。目前的办法只能在数据库层面杀掉相关的会话以解决问题,但在极端情况下通过杀会话并不能解决问题。
因此来讲,Oracle与MySQL关于进程与线程的优劣之争各有各有优势和缺点。重要的事,正确理解,把握解决问题之道才是关键。