MySQL优化
--何旭东
MySQL使用内存
引擎的特点
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进程对它们完成状态收集工作。
僵尸进程将会导致资源浪费,而孤儿则不会。
最多可以多少个进程同时存在
[email protected] ~]$ cat/proc/sys/kernel/pid_max
32768
linux负载,是内核数的3倍
Linux允许的最大进程数可以通过 ulimit -u来查看