MySQL性能优化实践( 五 )


6.2.4 索引失效情况除了违背索引创建和使用原则外,如下情况也会导致索引失效:
1) 模糊查询时,以 % 开头
2) 使用 or 时,如:字段1(非索引)or 字段2(索引)会导致索引失效 。
3) 使用复合索引时,不使用第一个索引列 。
index(a,b,c) ,以字段 a,b,c 作为复合索引为例:

MySQL性能优化实践

文章插图
 
6.3.1 选择合适的数据类型6.3 数据库表结构设计1) 使用可以存下数据最小的数据类型
2) 使用简单的数据类型 。int 要比 varchar 类型在mysql处理简单
3) 尽量使用 tinyint、smallint、mediumint 作为整数类型而非 int
4) 尽可能使用 not null 定义字段,因为 null 占用4字节空间
5) 尽量少用 text 类型,非用不可时最好考虑分表
6) 尽量使用 timestamp 而非 datetime
7) 单表不要有太多字段,建议在 20 以内
6.3.2 表的拆分当数据库中的数据非常大时,查询优化方案也不能解决查询速度慢的问题时,我们可以考虑拆分表,让每张表的数据量变小,从而提高查询效率 。
1) 垂直拆分:将表中多个列分开放到不同的表中 。例如用户表中一些字段经常被访问,将这些字段放在一张表中,另外一些不常用的字段放在另一张表中 。插入数据时,使用事务确保两张表的数据一致性 。
2) 水平拆分:按照行进行拆分 。例如用户表中,使用用户ID,对用户ID取10的余数,将用户数据均匀的分配到0~9的10个用户表中 。查找时也按照这个规则查询数据 。
6.3.3 读写分离一般情况下对数据库而言都是“读多写少” 。换言之,数据库的压力多数是因为大量的读取数据的操作造成的 。我们可以采用数据库集群的方案,使用一个库作为主库,负责写入数据;其他库为从库,负责读取数据 。这样可以缓解对数据库的访问压力 。
七、服务器参数调优
7.1 内存相关sortbuffersize 排序缓冲区内存大小
joinbuffersize 使用连接缓冲区大小
readbuffersize 全表扫描时分配的缓冲区大小
7.2 IO 相关Innodblogfile_size 事务日志大小
Innodblogfilesingroup 事务日志个数
Innodblogbuffer_size 事务日志缓冲区大小
Innodbflushlogattrx_commit 事务日志刷新策略 ,其值如下:
0:每秒进行一次 log 写入 cache,并 flush log 到磁盘
1:在每次事务提交执行 log 写入 cache,并 flush log 到磁盘
2:每次事务提交,执行 log 数据写到 cache,每秒执行一次 flush log 到磁盘
7.3 安全相关expirelogsdays 指定自动清理 binlog 的天数
maxallowedpacket 控制 MySQL 可以接收的包的大小
skipnameresolve 禁用 DNS 查找
read_only 禁止非 super 权限用户写权限
skipslavestart 级你用 slave 自动恢复
7.4 其他max_connections 控制允许的最大连接数
tmptablesize 临时表大小
maxheaptable_size 最大内存表大小
笔者并没有使用这些参数对 MySQL 服务器进行调优,具体详情介绍和性能效果请参考文章末尾的资料或另行百度 。
八、硬件选购和参数优化
硬件的性能直接决定 MySQL 数据库的性能 。硬件的性能瓶颈,直接决定 MySQL 数据库的运行数据和效率 。
作为软件开发程序员,我们主要关注软件方面的优化内容,以下硬件方面的优化作为了解即可
8.1 内存相关内存的 IO 比硬盘的速度快很多,可以增加系统的缓冲区容量,使数据在内存停留的时间更长,以减少磁盘的 IO
8.2 磁盘 I/O 相关1) 使用 SSD 或 PCle SSD 设备,至少获得数百倍甚至万倍的 IOPS 提升
2) 购置阵列卡同时配备 CACHE 及 BBU 模块,可以明显提升 IOPS
3) 尽可能选用 RAID-10,而非 RAID-5
8.3 配置 CUP 相关在服务器的 BIOS 设置中,调整如下配置:
1) 选择 Performance Per Watt Optimized(DAPC)模式,发挥 CPU 最大性能
2) 关闭 C1E 和 C States 等选项,提升 CPU 效率
3) Memory Frequency(内存频率)选择 Maximum Performance




推荐阅读