MySQL优化

                                                                                    --何旭东

wKioL1dnnZ2BRTIHAABANBXUs0E228.jpg

MySQL使用内存

wKiom1dnnXvwWlwdAAC-RhqEAwc760.jpg


引擎的特点

     Comment: Supports transactions, row-level locking, and foreign keys

 

Supports transactions:事务

 row-level locking:行锁

foreign keys:外键。

 

Transactions:表示是否支持事务处理,YES表示支持,NO表示不支持。

XA:表示是否分布式交易处理XA规范,YES表示支持,NO表示不支持。

Savepoints:表示是否支持保存点,以便事务回滚到保存点,YES表示支持,NO表示不支持。

 

目前InnoDB采用双轨授权,一个是GPL授权,另一个则是专有软件授权。

InnoDB存储引擎给MySQL数据库提供了具有事务,回滚和崩溃修复能力,多版本并发控制的事务安全性表。InnoDB存储引擎也提供了行级锁。

优势:良好的事务管理,崩溃修复能力和并发控制。

缺点:读写效率稍差,占用数据空间相对较大。

 

3个方面介绍InnoDB的特点:

1 InnoDB存储引擎中存储表和索引有两种方式:共享表空间存储和多表空间存储。

共享表空间存储。创建的表结构存储在后缀是.frm的文件中,数据和索引存在innodb_data_home_dir和innodb_data_file_path定义的表空间中。

多表空间存储。创建的表结构存储在后缀名是.frm的文件中,但是每个表的数据和索引单独保存在.ibd文件中。如果为分区表,则每个分区表对应单独的.ibd文件,文件名是表明+分区名。如果为分区表,则每个分区表对应单独的.ibd文件,文件名是表名+分区名。使用多表空间存储需要设置参数innodb_file_per_table,并且重启服务才能生效,只对新建表有效。

2 InnoDB存储引擎支持外键,外键所在的表为子表,外键所依赖的表为夫表。夫表被子表外键关联的字段必须为主键。如果删除,修改夫表中的某条信息时,子表也必须有相应改变。

3 InnoDB存储引擎支持自动增长列AUTO_INCREMENT,自动增长列的值不能为空,而且值必须唯一。另外在MySQL数据库中规定自增列必须为主键,再插入值时,自动增长分为3种情况。

一、如果自动增长列不输入值,则插入的列自动增长后的值。

二、如果输入的值为0或空(NULL),则插入的值也为自动增长后的值。

三、如果插入某个确定的值,且该值在前面的数据没有出现过,则可以直接插入。

线程特点

#在5.1的4个FILE_iO 线程包括: 
insert buffer thread
log thread 
read thread
write thread

#而在5.5, 总共有10个FILE_IO线程

(insert buffer thread) * 1
(log thread) * 1 
(read thread) * 4 
(write thread) * 4

常规优化的十个参数

(1)、max_connections: 
(2)、record_buffer: 
(3)、key_buffer_size: 
4)、back_log: 
(5)、interactive_timeout: 
(6)、sort_buffer: 
(7)、table_cache: 
(8)、thread_cache_size: 
(9)、mysql的搜索功能 
(10)、wait_timeout: 

系统层IO调度算法

noop anticipatory deadline [cfq] 
deadline :    deadline 算法保证对既定的IO请求以最小的延迟时间。
anticipatory:    有个IO发生后,如果又有进程请求IO,则产生一个默认6ms猜测时间,猜测下一个进程请求IO是干什么。这对于随机读取会造成较大的延时。
        对数据库应用很糟糕,而对于Web Server等则会表现不错。
cfq:        对每个进程维护一个IO队列,各个进程发来的IO请求会被cfq以轮循方式处理,对每一个IO请求都是公平。适合离散读的应用。
noop:        对所有IO请求都用FIFO队列形式处理。默认IO不会存在性能问题。

优化swap分区

默认60,当swap空间使用达到60%的时候,开始释放物理内存中的cache/buffers。

刷磁盘机制

mysql日志操作步骤 :log_buffer ---mysql写 (write)---> log_file ---OS刷新(flush)---> disk

0:log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的commit并不会触发任何log buffer 到log file的刷新或者文件系统到磁盘的刷新操作;

1:在每次事务提交的时候将log buffer 中的数据都会写入到log file,同时也会触发文件系统到磁盘的同步;

2:事务提交会触发log buffer 到log file的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘同步操作。

具体的展示

0(延迟写): log_buffer  --每隔1秒--> log_file  —实时—> disk

1(实时写,实时刷): log_buffer  —实时—>  log_file  —实时—> disk

2(实时写,延迟刷): log_buffer  —实时—> log_file --每隔1秒-->disk

进程管理思想

僵尸进程:一个子进程在其父进程没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。如果其父进程还存在而一直不调用wait,则该僵尸进程将无法回收,等到其父进程退出后该进程将被init回收。
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
僵尸进程将会导致资源浪费,而孤儿则不会。

 

最多可以多少个进程同时存在

bob@mail ~]$ cat/proc/sys/kernel/pid_max
32768

linux负载,是内核数的3倍

Linux允许的最大进程数可以通过 ulimit -u来查看