MySql 从四个方面谈性能优化

一、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磁盘矩阵的磁盘高可用,顺序读写高,随机读写效率低










猜你喜欢

转载自blog.csdn.net/dongfei2033/article/details/79895469
今日推荐