47
Optimzing mysql

Optimzing mysql

Embed Size (px)

Citation preview

Page 1: Optimzing mysql

Optimzing mysql

Page 2: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

I feel the need....the need for speed.

壮志凌云(to

p g

un

Page 3: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

• 性能监控 10 分• 性能优化 20 分• 常见的架构 10 分• Tools and tips 10 分

Page 4: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

性能监控• 操作系统级别的• Mysql 级别

Page 5: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

操作系统• vmstat • iostat• free• top• sar• mpstat• uptime,• netstat• strace

Page 6: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

mysql• Show processlist • Mysqlreport http://hackmysql.com/mysqlreportguide

• Mysqladmin -uxxx –p -i 1 -r extendedstatus|grep -v “| 0”• Innotop http://www.xaprb.com/blog/2006/07/02/innotop-mysql-innodb-monitor/

• Show global status,show inondb status show session status;• Mytop • Explain• Profiling• Mysqldumpslow mysqlsla• sysbench

Page 7: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

vmstat• 基本的物理和虚拟内存的使用和一些基本

的系统统计信息• Vmstat –S M Vmstat 5 5

• Swap 颠簸现象• Top ps axl

Page 8: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

iostat• 度量磁盘 i/o,cpu 和设备 io 使用• Iostat -c iostat –dx 5

• %iowait

• 并发请求的数量 并发 = ( r/s+w/s ) *(svctm/1000)( 从头到

尾服务请求时间 )

Page 9: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

Cpu 密集型机器

Page 10: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

Io 密集型

Page 11: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

Swap idle

Page 12: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

谁可能导致高的 cpu usage• query , joins,every

• 进程切换,• 锁表• 内存排序• 临时表• 加密算法

谁可能导致高的 disk usage• 临时表• 硬盘上排序

start with an idea ,then look for infromation support it

Page 13: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

netstat• 服务链接状态 netstat -nat |awk '{print $6}' | sort | uniq -c | sort -

n • 是否被 dos : netstat -atun | awk '{print $5}' | cut

-d: -f1 | sed -e '/^$/d' |sort | uniq -c | sort -n • /bin/netstat -na|grep ESTABLISHED|awk '{print

$5}'|awk -F: '{print $1}'|sort|uniq -c|sort -rn|grep -v -E '172.16|127.0'|awk '{if ($2!=null && $1>10) {print $1,$2}}'

Page 14: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

其它• Top :• Ps : ps aux|awk '{ if ($6 >(1024*15))

{print $2}}'|grep -v PID

• ………………

Page 15: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

分析服务器• Mysqlreport

• Mysqladmin mysqladmin extended -r -i 10| grep –v “| 0 ” -uroot –p

• Innotop ….

• Show global status

• Show innodb status

Page 16: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

分析查询• Show processlist

• Flush status

• Show session status like ‘Select%’

• Show session status like ‘Handler%’

• Show session status like ‘Sort%’

• Show session status like ‘Create%’

• Set profiling

Page 17: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

分析 mysql 连接• netstat -ntp| grep :40327

• netstat -ntp| grep 10940/mysqld

• grep 3306 /etc/services

• ps -eaf| grep 'UID\|10940'

• lsof -i -P| grep 10942

Page 18: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

性能优化• 操作系统 • mysql

• 应用程序

Page 19: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

操作系统

• 不要交换区。如果内存不足,增加更多的内存或配置你的系统使用较少内存。

flick:echo 0 > /proc/sys/vm/swappiness innodb_flush_method=O_DIRECT

• 不要使用 NFS 磁盘 ( 会有 NFS 锁定的问题 ) 。 • 增加系统和 MySQL 服务器的打开文件数量。 ( 在

safe_mysqld 脚本中加入 ulimit -n #) 。 • 增加系统的进程和线程数量。 • 选择使用哪种文件系统。在 Linux 上的 Reiserfs 对

于打开、读写都非常快。文件检查只需几秒种。

Page 20: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

Mysql 配置Mysiam 缓存key_buffer_size key_buffer_1.key_buffer_size=1G show variables like 'key_buffer_size'; show global status like 'key_read%'; key_cache_miss_rate = Key_reads / Key_read_requests * 100% du –sch `find /mysqldatapath/ -name “*.MYI”`

Innodb 缓冲池innodb_bufer_pool_size 80%show status like 'Innodb_buffer_pool_read%'Innodb_buffer_pool_read_requests/Innodb_buffer_pool_readsshow innodb status\G BUFFER POOL AND MEMORY Total memory allocated 4668764894;

Page 21: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

查询缓存 • show global status like 'Qcache%';

• show variables ‘like query_cache%'; • 查询缓存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size *

100% • 查询缓存命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%• http://www.day32.com/MySQL/

Page 22: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

innodb• 刷写日志缓冲 Innodb_flush_log_at_trx_commit 0 1 2 • 打开并清写日志和文件 innodb_flush_method

Page 23: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

myisam• 初始化: initial =key_buffer_size + query_cache_size

• 连接 per_connection=(sort_buffer_size +read_rnd_buffer_size + join_buffer_size +

read_buffer_size + thead_stack )

• 总和: initial + max_connections * per_connection

initial + ((max_connections * per_connection)/3)

Page 24: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

innodb• 初始化:

initial =innodb_buffer_pool_size + query_cache_size

• 连接per_connection = (sort_buffer_size + join_buffer_size + thead_stack + binlog_cache_size + read_buffer_size + read_rnd_buffer_size)

• 总和: initial + max_connections * per_connection

initial + ((max_connections * per_connection)/3)

Page 25: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

数据类型选择1. 更小通常更好 , 慷慨并不明智2. 简单就好 使用 mysql 内建的类型保存日期和时间,使用 timestamp 保存,空间是 datetime 一半 使用整数保存 ip

15 bytes for char(15) vs. 4 bytes for the integer

ip2long() 和 long2ip() inet_aton

3 尽量避免 null

4 Char /varcha 的选择 对于 MyISAM 而言,如果没有 VARCHAR , TEXT 等变长类型,那么每行数据所占用的空间都是

定长的( Fixed ),俗称静态表,相对应的就是动态表。当执行一次查询时, MySQL 可以通过索引文件找到所需内容的实际行号,此时,由于每行数据所占用的空间都是定长的( Fixed ),所以可以通过查询到的实际行号直接定位到数据文件的具体位置,

对于 InnoDB 而言,数据行是没有所谓定长与否的概念的,这是由其结构所决定的:在 InnoDB 中,数据就位于 Primary Key 的 B-Tree 叶节点之上而除 Primary Key 之外的索引被称为 Secondary Index ,它们直接指向 Primary Key 。

用 char 来代替 varchar , MyISAM 是这样, InnoDB 则相反5 使用 enum 代替字符串类型 select internet + 0 from hotel_info group by internet;

Page 26: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

索引• 隔离列

select * from tablename where id+1=5

Select * where TO_DAYS(CURRENT_DATE) – TO_DAYS(data_col) < =10

Select * where data_col >=date_sub(current_date,interval 10 day)

Select * where data_col >= date_sum(‘2010-04-12’,interval 10 day)

EXPLAIN SELECT * FROM film WHERE title LIKE 'Tr%'\G

EXPLAIN SELECT * FROM film WHERE LEFT(title,2) = 'Tr' \G

• 组合索引 前缀索引• 覆盖索引• 合并索引• 去除多余索引和重复索引 create table test (id int not null primary

key, unique(id),

index(id)

)

Page 27: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

合并索引• 索引合并方法用于通过 range扫描搜索行并将结果合成一个。合并会产 生并集、交集

或者正在进行的扫描的交集的并集。• 在 EXPLAIN输出中,该方法表现为 type列内的 index_merge 。 在这种情况下, key列包含一列使用的索引, key_len包含这些索引的最长的关键元素

SELECT * FROM tbl_name WHERE key_part1 = 10 OR key_part2 = 20;

Page 28: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

前缀索引Key(a,b,c)Order by a ,order by a,b order by a,b,c order by a desc ,b desc,c desc

Where a = const order by b,c,where a=const and b =const order by c

Where a = const order by b,c where a = const and b > const order by,c

Order by a asc,b desc,c desc

Where g = const oder by b ,c

Where a = const order by c

Where a = const order by a ,d

Where a>’xx’ order by b,c

Where a>’xx’ order by a,b

Where a=const order by b desc ,a asc

Page 29: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

覆盖索引Select * from products where actor=‘sean carrey’ and and title like ‘%apollo%’

Select * from products join (select prod_id from products where actor= ‘sean carrey’ and title like ‘%apollo%’) as t1 on (t1.prod_id = products.pro_id)

Page 30: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

逆范式化• 适当的冗余• 分拆表

Page 31: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

产品设计• 产品设计 -> 数据交互 ->mysql

• Antoine de Saint—Exupery 是法国作家兼飞机设计师,他曾经说过:“设计者确定其设计已经达到了完美的标准不是不能再增加任何东西,而是不能再减少任何东 西。”

• 分页的实现

Page 32: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

http://www.douban.com/group/BigBangTheory/discussion?start=25

Page 33: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

1 explain select SQL_NO_CACHE * from page_test force index(idx_b_c) where b=1 order by c desc limit 2000,10;+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------------+| 1 | SIMPLE | page_test | ref | idx_b_c | idx_b_c | 4 | const | 2222 | Using where |+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------------+2mysql> explain select SQL_NO_CACHE * from page_test, (select SQL_NO_CACHE id from page_test force

index(idx_b_c) where b=1 order by c desc limit 2000,10) temp where page_test.id=temp.id;+----+-------------+------------+--------+---------------+---------+---------+---------+------+--------------------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+------------+--------+---------------+---------+---------+---------+------+--------------------------+| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 10 | || 1 | PRIMARY | page_test | eq_ref | PRIMARY | PRIMARY | 8 | temp.id | 1 | || 2 | DERIVED | page_test | ref | idx_b_c | idx_b_c | 4 | | 2222 | Using where; Using index |+----+-------------+------------+--------+---------------+---------+---------+---------+------+--------------------------+3 explain select SQL_NO_CACHE * from page_test force index(idx_b_id) where b=1 and id<187796 order by id

desc limit 10;+----+-------------+-----------+-------+---------------+----------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-----------+-------+---------------+----------+---------+------+------+-------------+| 1 | SIMPLE | page_test | range | idx_b_id | idx_b_id | 12 | NULL | 190 | Using where |+----+-------------+-----------+-------+---------------+----------+---------+------+------+-------------+

5 select SQL_NO_CACHE * from page_test force index(idx_b_c) where b=1 order by c desc 870,10 select SQL_NO_CACHE * from page_test force index(idx_b_c) where b=1 order by c asc 9120,10 ./tuning-primer.sh all

Page 34: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

优化 count(*)• Mysiam: select sql_no_cache count(*) from statistic_go where id > 10;

select sql_no_cache (select count(*) from statistic_go) - count(*) from statistic_go where id <=10;

• Innodb  :在缺少 where 字句的情况下, InnoDB 不对 count(*) 查询进行优化–这个是事实。

SELECT COUNT(*) FROM sbtest1 WHERE id>=0;

建立计数器触发器对同一个表的 select 和 update

update hotel_image inner join (select count(*) as cnt from hotel_image) as der set hotel_image.size = der.cnt;

Page 35: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

Page 36: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

其它一些• Group by 不进行排序,可以 ordery by null• 能够快速缩小结果集的 WHERE条件写在前面,如果有恒量条件,也尽量放在前面• 使用 UNION 来取代 IN 和 OR

• 定期执行 optimize / analyze table

• 往 innoDB 表导入数据时,先关闭 autocommit模式,否则会实时刷新数据到磁盘• 对于频繁更改的 MyISAM 表 , 应尽量避免更新所有变长字段 (VARCHAR 、 BLOB 和 TEXT)

• 分表 分库• 汇总表 十大热门话题 create table hotel_infonew like hotel_info; rename table

hotel_info to hotel_info_old ,hotel_infonew to hotel_info• 放弃关系型数据库 key=>value ,计数表

Page 37: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

常见架构方案• Replication

• 双 master

• 集群。。。。。

Page 38: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

replication1 数据分发 ,scale out , sacle up

2 负载均衡 load balance

3 备份,一般不会用作备份,一旦执行 delete 操作, replication也不会保留

4 高可用 5 可以在不同的主从库上使用不同的存储引擎

Page 39: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

Page 40: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

原理

Page 41: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

• 简单的讲就是 master记录其变化到 binlog , slave 接收到变化后会记录到他的 Relay log , slave 通过重放 relay log ,然后就写进自己的 log1) 、 Slave 上面的 IO 进程连接上 Master ,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;2) 、 Master 接收到来自 Slave 的 IO 进程的请求后,通过负责复制的IO 进程根据请求信息读取制定日志指定位置之后的日志信息,返回给 Slave 的 IO 进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到 Master端的 bin-log 文件的名称以及 bin-log的位置;3) 、 Slave 的 IO 进程接收到信息后,将接收到的日志内容依次添加到 Slave端的 relay-log 文件的最末端,并将读取到的 Master端的 bin-log 的文件名和位置记录到 master-info 文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个 bin-log 的哪 个位置开始往后的日志内容,请发给我”;4) 、 Slave 的 Sql 进程检测到 relay-log 中新增加了内容后,会马上解析 relay-log 的内容成为在 Master端真实执行时候的那些可执行的内容,并在自身执行

Page 42: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

常见问题• 延迟• 主从不同步• 命令复制 基于行复制

Page 43: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

高可用• 通过 Heartbert2 让 Mysql Replication 具有 HA

Page 44: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

双 master

Page 45: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

工具• Innotop

• Maatkit mk-table-checksum

mk-table-sync

mk-parallel-dump

mk-parallel-restore

mk-find

• Optimize table 脚本

Page 46: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

Tools and tips• \h 命令 • 大批量数据的导入 load data infile ‘/path/to/file’ into table tbl_name; alter table tbl_name disable keys; alter table tbl_name enable keys; • 快速复制表结构: create table clone_tbl select * from tbl_name limit 0• Gdb 更改mysql 配置 show variables like 'log_slave_updates'; set global log_slave_updates=1; system gdb -p $(pidof mysqld) -ex "set opt_log_slave_updates=1" -batch gdb -p $(pidof mysqld) \ -ex "set max_connections=5000" \ -ex "call

resize_thr_alarm(5030)" -batch• truncate table 不能复制到从库• perl -ne ‘m/^([^#][^\s=]+)\s*(=.*|)/ && printf(“%-35s%s\n”, $1, $2)’ /etc/mysql/my.cnf 美

化 my.cnf• 加快 alter table• Dump 文件中找出 create table sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `hotel_info`/!

d;q' hotel_new2010-3-1117.sql

Page 47: Optimzing mysql

…………… 北京酷讯科技有限公司 ……………

同一个团队,同一个梦想 Thanks!