性能优化之MySQL优化(一)
http://dev.mysql.com/doc/index-other.html
http://dev.mysql.com/doc/sakila/en/sakila-installation.html(使用教程)
下载sakila数据库:http://dev.mysql.com/doc/index-other.html或者是http://downloads.mysql.com/docs/sakila-db.zip
解压sakila-db.zip到Desktop,里面包含三个文件
sakila.mwb
sakila-schema.sql //数据库结构文件
sakila-data.sql //数据文件
select @@version;查看MySQL版本
慢查日志分析软件:mysqldumpslow——mysql官方分析软件
启用mysqldumpslow时首先要在workbench中设置basedir的路径才能避免报错
mysqldumpslow 在windows中是一个perl文件,所以需要你配置perl环境变量,并使用perl运行
查看慢查询日志,命令:mysqldumpslow -t 要查看的条数 日志文件的位置 | more
慢查询分析工具2:pt-query-digest
输出到文件:pt-query-digest show-log > slow_log.report
输出到数据库表 pt-query-digest show.log -review
h=127.0.0.1,D=test,p=root.P=3306,u=root,t=query_review
--create-reviewtable
--review-history t=hostname_show
性能优化之MySQL优化(二)
count(*)和count(release_year)的区别:
count(*)统计满足条件的记录数release_year=null的记录也会被统计,count(release_year)则会排除为null的结果再统计。
子查询优化时,如果是一对多查询,使用join on时要用distinct去重
如果子查询in中有重复的数据,从查询的结果是看不出来的,因为in(1,1)只会返回一条记录.但是join会显示两条.尽量用join
group by可能会出现临时表(Using temporary),文件排序(Using filesort)等,影响效率。
可以通过关联的子查询,来避免产生临时表和文件排序,可以节省io
如果涉及到表联接的过程中有group by这样的语句,可以先通过group by做为子查询,统计出结果后,再与其它表进行关联查询。
优化group by 查询后,要在外面加上筛选条件则在子查询中增加
性能优化之MySQL优化(三)
当一个索引包含了查询中的所有列 就成为覆盖索引
离散度:数据唯一值越多,离散度越高。例如,
select count(distinct id),count(distinct real_name) from user;
id 是唯一值,所以离散度更高。而 real_name 会出现重复—>会有同名同姓的情况,所以离散度低。
select count(distinct customer_id), count(distinct staff_id) from payment;
查看离散度 通过统计不同的列值来实现 count越大 离散程度越高
索引中是字段越小约好,因为是分页进行存储的,字段越小,一页中索引会包含越多。
pt-duplicate-key-checker这个工具可以用来查询冗余索引
pt-duplicate-key-checker
检查多余keypt-index-usage
索引检查pt-query-digest 慢查询分析
数据库优化之使用bigint来存储IP地址。
数据库优化之使用int来存储日期
如果用null,其表结构和not null的不一样,null字段存储会占用比较多,会增加io开销
1、时间转时间戳:unix_timestamp("2016-08-01 13:14:00");
2、时间戳转时间:fromm_unixtime(1508076155)
性能优化之MySQL优化(四)
为了查询效率,有些时间需要反范型化
反范式化操作,适当增加复杂性,提高数据库操作效率
反范式化: 增加冗余信息,少关联表,以空间换时间
表的水平拆分。前后台业务分离,前台查询分表的数据,后台要执行报表操作则把数据统一到汇总表再操作
/usr/sbin/mysqld - -verbose - -help | grep -A 1 'Default options '
查看MySQL配置文件路径,如果存在多个配置文件,则后面的会覆盖前面的
#重要,缓冲池的大小 推荐总内存量的75%,越大越好。innodb_buffer_pool_size
#默认只有一个缓冲池,如果一个缓冲池中并发量过大,容易阻塞,此时可以分为多个缓冲
mysql第三方配置工具:
https://tools.percona.com/wizard