一、SQL及索引优化
1、建立慢查日志,记录某SQL语句查询时间,便于定位。工具:mysqldumpslow -s(排序方式) -t (前几次)/日志路径
工具:pt-query-digest pt-query-digest 定位有问题的sql语句;a、查询次数多且每次查询占用时间长的SQL
IO大的SQL(注意 rows examine项)、未命中索引的SQL(rows examine、和rows send项对比)
2、通过慢日志找到性能低的sql语句后对其进行优化;用工具语句 explain查询sql的执行计划,出现using filesort /temporary则需要优化
max()|count()这种遍地的查询需要创建索引;创建索引:create index idx_paydete on payment(payment_date);count(*)与count(id)值不同,null行不计入ID数
子查询优化:select * from t where t.id in (select t1.tid from t1)-->select t.id from t join t1 on t.id = t1.tid;-->select distinct(去重) t.id from t join t1 on t.id = t1.tid
group by 的优化:
limit 查询的优化:(使用有索引的列或主键进行 order by 操作)
select film_id,description from sakila.film order by title limit 50,5;
—>select film_id,description from sakila.film order by film_id limit 50,5; (下面的是记录上次返回的主键,在下次查询时使用主键过滤)
-->select film_id,description from sakila.film where film_id >55 and film_id<=60 order by film_id limit 1,5;
3、如何选择合适的列建立索引
a、在where 从句,group by 、order by 、on从句出现的列
b、索引字段越小越好
c、离散度大的列放在联合索引的前面(查离散度:select count(distinct customer_id),count(distinct staff_id)from payment),
比较谁的count值更大。
4、索引的·优化
a、去除重复冗余的索引
b、定位重复索引并删工具: pt-duplicate-key-checker +数据库用户名+密码+ip
c、索引的维护和优化 :配合慢查日志和pt-index-usage pt-index-usage+user+密码+慢查日志
二、数据库表结构优化
5、表结构的优化
a、选择合适的数据类型 比如时间也可以 int型;只需函数from_unixtime(),unix_timestamp()俩个函数进行切换
ip地址需用inet_aton(),inet_ntoa()进行转换
b、尽可能的选用 not null 定义字段,给出默认值,因为inodb存储特性,会对null类型需要额外字段进行存储
c、尽量少用text类型,非用不可时最好考虑分表(放到附加表)
6、表的范式化和反范式化
a、遵循第三范式,即数据表中不存在非关键字段对任意候选关键字段的传递函数依赖
错误实例:数据冗余;数据的插入异常;数据的更新异常、数据的删除异常
b、反范式化;空间换取时间,优化查询速率
7、数据库表的垂直拆分
解决宽度过宽,导致查询效率低下:
a、把不常用、大字段的字段单独放在一个表中
b、把经常一起使用的字段放到一起
8、数据库的水平拆分
解决表中数据量过大的问题
a、分法eg:mod(customer_id,5)分成0-4共5组
b、挑战:跨分区表进行数据查询、统计及后台报表操作(前后台业务分开,前台分,后台合)
三、系统配置优化
8、操作系统的优化
修改/etc/sysctl.conf文件 ;比如增加tcp支持的队列数;;;减少断开连接时,资源回收
/etc/security/limits.conf #修改打开文件数限制 ulimit -a 查看
使用硬件防火墙,关闭iptables、selinux
9、mysql 系统本身的优化
配置文件 :/etc/my.cnf 或 /etc/mysql/my.cnf
a、调整缓冲池 innodb_buffer_pool_size==75%内存大小和缓冲池个数 innodb_buffer_pool_instances
b、innodb_flush_at_trx_commit =0|1|2s ,将信息更新到磁盘时间频率,对io效率影响很大
c、inmodb_read_io_threads和innodb_write_io_threads
d、innodb_file_per_table ==off 共享表空间采用独立的空间
f、inonodb_stats_on_metadata ==off 一般操作统计信息刷新关闭
10、第三方工具调mysql系统性能
percona toolkit
a、pt-mysql-summary #查看mysql的各个统计信息
b、pt-slave-find #查找和显示指定的Master 有多少个Slave
c、pt-query-digest /data/mysql/master-log.000007 慢日志查询
修改表结构并保留原表
pt-online-schema-change, test111库的tbl_app_table新增app_status字段默认为0
四、服务器硬件优化
a、选择哪种cpu核数
b、磁盘io优化:raido:io效果最好,安全不好,无备份 raid1 raid5:最少3个盘,一个用于奇偶校验 效率为 n-1/n
网络SNA 和SNA磁盘矩阵的磁盘高可用,顺序读写高,随机读写效率低