您的位置:首页 > 数据库 > MySQL

数据库优化之MySQL优化(三):

2017-11-02 14:40 375 查看
数据库结构优化

1:选择合适的数据类型

数据类型的选择重点在于合适两个字,如何确定选择的数据类型是否合适?

1.使用可以存下你的数据的最小的数据类型

2.使用简单的数据类型,Int要比varchar类型在mysql处理上简单

3.尽可能的使用not noll定义字段

4.尽量少用text类型,非用不可时最好考虑分表

时间优化

使用int来存储日期时间,利用from_unixtime(),unix_timestamp()两个函数来进行转换

create table test(id int auto_increment not null,timestr int,primary key(id));

insert into test(timestr) values(unix_timestamp(‘2014-06-01 13:12:00’));

插入的时候把时间类型转换成int类型

select from_unixtime(timestr) from test;

查询的时候把int类型的时间戳转成想要的时间格式

IP地址优化:

使用bigint来IP地址,利用inet_aton() inet_ntoa()两个函数来进行转换

create table sessions(id int auto_increment not null,ipaddress bigint,primary key(id));

insert into sessions(ipaddress) values(inet_aton(‘192.168.0.1’));

插入的时候把ip地址转换成bigint类型

select inet_ntoa(ipaddress) from sessions;

查询的时候再转换成ip

总结

时间:

1、时间转时间戳:unix_timestamp(“2016-08-01 13:14:00”);

2、时间戳转时间:fromm_unixtime(1508076155)

IP:

ip 转 bigint:inet_aton(“192.168.168.168”)

bigint 转 ip:inet_ntoa(3232278696)

表的范式化和反范式化

范式化是指数据库设计的规范,目前说到范式化一般是指第三设计范式,也就是要求数据表中不存在非关键字段对任意候选关键字段的传递函数依赖则符合第三范式。

若存在不符合第三范式的要求的表,解决方法是 拆分表。将不符合要求的表拆分为两份表,用之前的非关键字列作为新表的关键字,然后建立起新表和旧表的关联表

第三范式是指:作为非主键的字段对主键字段没有相互依赖的关系。

表的范式化即数据库设计的规范化:数据表不存在非关键字段对任意关键字段的传递函数依赖,则符合第三范式。

可以将一张数据表进行拆分,来满足第三范式的要求。

设计表的时候符合范式化就为了 :减少数据冗余、减少表的插入、更新、删除异常。

设计表的时候使用反范式化是为了 :以空间换时间,增强代码的可编程性和可维护性

不符合第三范式要求的表存在以下问题:

1:数据冗余(分类、分类描述)对于每一个商品都会进行记录

2:数据插入异常

3:数据更新异常

4:数据删除异常

反范式化:

是指为了查询效率的考虑把原本符合第三范式的表适当的增加冗余,以达到优化查询效率的目的,反范式化是一种以空间来换取时间的操作。

注意:适当增加复杂性,提高数据库的操作效率

group by会使用临时表,增加IO操作,降低查询效率

数据库表的垂直拆分:

就是把原来一个有很多列的表拆分成多个表,这解决了表的宽度问题。

通常垂直拆分可以按以下原则进行:

1.把不常用的字段单独存放到一个表中

2.把大字段独立存放到一个表中

3.把经常一起使用的字段放到一起

总结:

1:表的垂直拆分。把不常用的列拆分出去,把数据类型大的列拆分,把常用的放在一起

2:常用字段一个表,不常用字段一个表,大字段一个表

表的水平拆分:

为了解决单表的数据量过大的问题,水平拆分的表每一个表的结构都是完全一直的。

常用的水平拆分方法为:

1.对customer_id进行hash运算,如果要拆分成5个表则使用mod(customer_id,5)取0~4的值

2:针对不同的hashID把数据存到不同的表中

挑战:

1.跨分区表进行数据查询

2.统计及后台报表操作

总结:

垂直拆分是拆字段,而水平拆分是表结构不变,把数据给分开啦。

系统配置优化

数据库是基于操作系统大的,目前大多数MySQL都是安装在Linux系统之上,所以对于操作系统的一些参数配置也会影响到MySQL的性能

1:网络方面,修改/etc/sysctl.conf文件,增加tcp支持的队列数,减少断开连接时,资源的回收。

2:打开文件数的限制。修改/etc/security/limits.conf文件,增加一下内容以修改打开文件数量的限制,关闭iptables,selinux等防火墙软件。

最好使用硬件防火墙,不要用软件防火墙。

注意:如果存在多个位置存在配置文件,则后面的会覆盖前面的。

重点:

/usr/sbin/mysqld - -verbose - -help | grep -A 1 ‘Default options ’

查看MySQL配置文件路径,如果存在多个配置文件,则后面的会覆盖前面的

重要,缓冲池的大小 推荐总内存量的75%,越大越好。

innodb_buffer_pool_size

默认只有一个缓冲池,如果一个缓冲池中并发量过大,容易阻塞,此时可以分为多个缓冲池;

innodb_buffer_pool_instances

log缓冲的大小,一般最常1s就会刷新一次,故不用太大;

innodb_log_buffer_size

重要,对io效率影响较大。0:1s刷新一次到磁盘;1:每次提交都会刷新到磁盘;2:每次提交刷新到缓冲区,1s刷新到磁盘;默认为1。

innodb_flush_log_at_trx_commit

读写的io进程数量,默认为4

innodb_read_io_threads

innodb_write_io_threads

重要,控制每个表使用独立的表空间,默认为OFF,即所有表建立在一个共享的表空间中。

innodb_file_per_table

mysql在什么情况下会刷新表的统计信息,一般为OFF。

innodb_stats_on_metadata

第三方配置工具的使用:Person Configuration Wizard

配置MySQL的配置文件使用工具更方便,主要就是调整配置的参数,值调整成什么样的参数才是合适的,需要经验。

服务器硬件优化

如何选择CPU?

思考:是选择单核更快的CPU还是核数更多的CPU?

1.MySQL有一些工作只能使用到单核CPU

Replicate,SQL……

2.MySQL对CPU核数的支持并不是越多越快

MySQL5.5使用的服务器不超过32核

参考视频:参考视频:http://www.imooc.com/learn/194
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 优化 mysql