标签:style blog http io ar os 使用 sp for
to be add...
---------------------------------------------------------------------------------------------------------------------
前辈文章原址
http://blog.chinaunix.net/uid-20639775-id-3154234.html
说明:本文的环境为CENTOS 5.5 64 Bit /Mysql 5.1.50
简介:使用Mysql有一段时间了,期间做了不少关于Mysql优化、设计、维护的工作,这两天有时间做一下简单的总结,方便自己回忆,同时也希望能对大家有点帮助.
I 硬件配置优化
II 操作系统级优化
[zhangxy@dowload_server1 ~]$ cat /etc/fstab
LABEL=/ / ext3 defaults,noatime,nodiratime 1 1
/dev/sda5 /data xfs defaults,noatime,nodiratime 1 2
net.ipv4.tcp_keepalive_time=7200
net.ipv4.tcp_max_syn_backlog=1024
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.neigh.default.gc_thresh3 = 2048
net.ipv4.neigh.default.gc_thresh2 = 1024
net.ipv4.neigh.default.gc_thresh1 = 256
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.tcp_syncookies = 1
net.core.netdev_max_backlog = 2048
net.core.dev_weight = 64
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_rfc1337 = 1
net.ipv4.tcp_sack = 0
net.ipv4.tcp_fin_timeout = 20
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_max_orphans = 32768
net.core.optmem_max = 20480
net.core.rmem_default = 16777216
net.core.rmem_max = 16777216
net.core.wmem_default = 16777216
net.core.wmem_max = 16777216
net.core.somaxconn = 500
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_max_tw_buckets = 18000
net.ipv4.ip_forward = 0
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.conf.all.rp_filter = 1
kernel.sysrq = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.ip_local_port_range = 5000 65000
kernel.shmmax = 167108864
vm.swappiness=0
Vim /etc/security/limits.conf
加上
* soft nofile 65535
* hard nofile 65535
/dev/sda5 /data xfs defaults,noatime,nodiratime 1 2
III Mysql设计优化
III.1存储引擎的选择
III.2命名规则
III.3字段类型选择
字段类型的选择的一般原则:
原因:更小的字段类型更小的字符数占用更少的内存,占用更少的磁盘空间,占用更少的磁盘IO,以及占用更少的带宽。
III.3.1 整型:
见如下图:
类型 |
字节 |
最小值 |
最大值 |
(带符号的/无符号的) |
(带符号的/无符号的) |
||
TINYINT |
1 |
-128 |
127 |
0 |
255 |
||
SMALLINT |
2 |
-32768 |
32767 |
0 |
65535 |
||
MEDIUMINT |
3 |
-8388608 |
8388607 |
0 |
16777215 |
||
INT |
4 |
-2147483648 |
2147483647 |
0 |
4294967295 |
||
BIGINT |
8 |
-9223372036854775808 |
9223372036854775807 |
0 |
18446744073709551615 |
根据满足需求的最小整数为选择原则,能用INT的就不要用BIGINT。
用无符号INT存储IP,而非CHAR(15)。
III.3.2 浮点型:
类型 |
字节 |
精度类型 |
使用场景 |
FLOAT(M,D) |
4 |
单精度 |
精度要求不高,数值比较小 |
DOUBLE(M,D)(REAL) |
8 |
双精度 |
精度要求不高,数值比较大 |
DECIMAL(M,D)(NUMERIC) |
M+2 |
自定义精度 |
精度要求很高的场景 |
III.3.3 时间类型
类型 |
取值范围 |
存储空间 |
零值表示法 |
DATE |
1000-01-01~9999-12-31 |
3字节 |
0000-00-00 |
TIME |
-838:59:59~838:59:59 |
3字节 |
00:00:00 |
DATETIME |
1000-01-01 00:00:00~9999-12-31 23:59:59 |
8字节 |
0000-00-00 00:00:00 |
TIMESTAMP |
19700101000000~2037年的某个时刻 |
4字节 |
00000000000000 |
YEAR |
YEAR(4):1901~2155 YEAR(2):1970~2069 |
1字节 |
0000 |
III.3.4 字符类型
类型 |
最大长度 |
占用存储空间 |
CHAR[(M)] |
M字节 |
M字节 |
VARCHAR[(M)] |
M字节 |
M+1字节 |
TINYBLOD,TINYTEXT |
2^8-1字节 |
L+1字节 |
BLOB,TEXT |
2^16-1字节 |
L+2 |
MEDIUMBLOB,MEDIUMTEXT |
2^24-1字节 |
L+3 |
LONGBLOB,LONGTEXT |
2^32-1字节 |
L+4 |
ENUM(‘value1‘,‘value2‘,...) |
65535个成员 |
1或2字节 |
SET(‘value1‘,‘value2‘,...) |
64个成员 |
1,2,3,4或8字节 |
注:L表示可变长度的意思
对于varchar和char的选择要根据引擎和具体情况的不同来选择,主要依据如下原则:
III.4编码选择
单字节 latin1
多字节 utf8(汉字占3个字节,英文字母占用一个字节)
如果含有中文字符的话最好都统一采用utf8类型,避免乱码的情况发生。
III.5主键选择原则
注:这里说的主键设计主要是针对INNODB引擎
推荐采用数值类型做主键并采用auto_increment属性让其自动增长。
III.6其他需要注意的地方
尽可能设置每个字段为NOT NULL,除非有特殊的需求,原因如下:
索引的缺点:极大地加速了查询,减少扫描和锁定的数据行数。
索引的缺点:占用磁盘空间,减慢了数据更新速度,增加了磁盘IO。
添加索引有如下原则:
适当的使用冗余的反范式设计,以空间换时间有的时候会很高效。
IV Mysql软件优化
V Mysql配置优化
注意:全局参数一经设置,随服务器启动预占用资源。
mysql索引缓冲,如果是采用myisam的话要重点设置这个参数,根据(key_reads/key_read_requests)判断
INNODB 数据、索引、日志缓冲最重要的引擎参数,根据(hit riatos和FILE I/O)判断
线程连接的超时时间,尽量不要设置很大,推荐10s
服务器允许的最大连接数,尽量不要设置太大,因为设置太大的话容易导致内存溢出,需要通过如下公式来确定:
SET @k_bytes = 1024;
SET @m_bytes = @k_bytes * 1024;
SET @g_bytes = @m_bytes * 1024;
SELECT
(
@@key_buffer_size + @@query_cache_size + @@tmp_table_size+
@@innodb_buffer_pool_size + @@innodb_additional_mem_pool_size+
@@innodb_log_buffer_size+
@@max_connections *
( @@read_buffer_size + @@read_rnd_buffer_size + @@sort_buffer_size+
@@join_buffer_size + @@binlog_cache_size + @@thread_stack
) )
/ @g_bytes AS MAX_MEMORY_USED_GB;
线程并发利用数量,(cpu+disk)*2,根据(os中显示的请求队列和tickets)判断
获得更快的--ORDER BY,GROUP BY,SELECT DISTINCT,UNION DISTINCT
当根据键进行分类操作时获得更快的--ORDER BY
join连接使用全表扫描连接的缓冲大小,根据select_full_join判断
全表扫描时为查询预留的缓冲大小,根据select_scan判断
临时内存表的设置,如果超过设置就会转化成磁盘表,根据参数(created_tmp_disk_tables)判断
记录INNODB引擎的redo log文件,设置较大的值意味着较长的恢复时间。
Linux系统可以使用O_DIRECT处理数据文件,避免OS级别的cache,O_DIRECT模式提高数据文件和日志文件的IO提交性能
VI Mysql语句级优化
标签:style blog http io ar os 使用 sp for
原文地址:http://www.cnblogs.com/johvoo/p/4143988.html