mysql数据库优化

时间:2022-06-28 06:53:04

mysql数据库优化

1-1

SQl 及索引

数据库表结构

系统配置

硬件

2-1

检查问题sql:慢查询日志

.show variables like 'slow_query_log'

.set global show_query_log_file='日志路径'

.set global log_queries_n ot_using_indexes=on

.set global long_query_time=1

工具:

1:mysqldumpslow -h /日志路径

2:pt-query-disgest

关注:查询时间长

IO大(扫描发送行数)

explain +sql

profile+ 查看内存占用和连接数

2-2 索引

1.字段索引,联合索引

2.count()优化

3.子查询-->链接

4.limit  查询列索引

5. 索引(where,order by,group by,多次查询)

联合索引(离散度高的列放在联合索引前面)

6.索引优化

主键不需要建立唯一索引

联合索引包含主键索引(innoDB会自己动在每个索引上附加主键联合索引)

7.查找冗余索引

pt-duplicate-key-checker工具

-uroot \

-p''\

-h +数据库地址

8.索引维护

pt-index-usage\

-uroot -p''\

mysql-slow.log

3-1表结构

1.最小数据类型(int=时间戳>varchar)

2.加not null(innodb会为空类型添加额外的信息)

3.少text,分表

3-2字符类型

1.from_unixtime()int转换时间格式

from_timestamp()时间格式转换为int

2.inet_aton()

inet_ntoa()

3:ip地址(bigint8字节,varchar要15个字节)

inet_aton(),

inet_ntoa()

4-1范式化

第三范式:要求数据表中不存在非关键字段对任意候选关键字段的传递函数依赖(字段间有逻辑关联关系)

1.冗余

2.插入、更新、删除异常

4-2反范式化(以空间换取时间)

对于经常联合查询字段进行冗余

4-3垂直拆分

1.不常用字段放在一个表内

2.大字段独立放在一个表

3.经常用的放在一个表里

水平拆分

1.数据量大的(历史数据)

hash拆分 对ID取模

针对不同类型的数据存放在不同表

(前台查询分表,后台查询总表保证效率)

5-1

系统优化

加快链接回收

增加连接数

/etc/security/limits.conf

*soft nofile  XXX

*hard nofile  XXX

配置文件参数

innodb_buffer_pool_size  缓冲池大小

只有innodb:总内存75%

适当减少

最小大小要大于所有数据和索引的总和

innodb_buffer_pool_instances

5.5新增  控制缓冲池个数,默认一个

innodb_log_buffer_size

innodb log 缓冲大小

存储一秒的数据量

innodnb_flush_log_at_trx_commit

数据把变更刷新到磁盘时间(012)

默认为1(每次提交刷新到磁盘)

0(每秒刷新,提交不刷新)

一般为2(放到缓冲区,每秒刷新到磁盘)

innodb_read_io_threads

innodb_write_io_threads

innodb读写的进程数默认为4

innodb_file_per_table

控制每个表适用独立的表空间 默认为off

也就是表都会建立在共享表空间中

建议为ON  增加并发效率

innodb_stats_on_metadata

决定mysql在什么情况下刷新表统计信息

默认ON,对表操作会刷新表统计信息

建议设为OFF,设置闲置时间刷新

系统配置优化

配置向导工具

硬件优化(成本高效果不明显)

CPU

mysql工作一般只使用一个CPU

对超过32核CPU支持不好

磁盘IO

raid0(连接多个磁盘为一个硬盘IO好  安全性不好,一损俱损)

raid1(至少两个磁盘,每组磁盘存储数据相同)

raid5(至少三个 安全性好)

单核更快>多核

数据库负载均衡、多服务器主从数据库、提高缓存来降低IO负载

数据库选择:

innodb 支持事物  mvcc的行级锁 事物处理

Archive 不支持事物 支持行级锁  主要用于日志记录只支持insert和select操作占用空间小

Ndb cluster 支持事物 行级锁  高可用性  多用于集群

有多少种日志:

错误日志:记录出错信息,也记录一些警告信息或者正确的信息

慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。

二进制日志:记录对数据库执行更改的所有操作

查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。

推荐博客:http://blog.jobbole.com/87989/