标签:实现 地方 表示 条件 否则 全文索引 长度 优化 判断
MYSQL性能优化总结:
1.选择合适的存储引擎:innoDB
除非你的数据表主要做只读或者全文索引,你应该默认选择:innoDB
2.数据表字段设计
a. 通常使用范式化设计,因为范式化通常会似的执行操作更快:
但我们有时需要混同范式化和反范式化,比如一个更新频率低的字段可以冗余在表中,避免关联查询
b.单表字段不宜过多:建议最多30个以内
c.选择小而简单的合适数据类型,比如字符串类型的,固定长度使用char,非定长度使用varchar,并分配合适且足够的空间;需储存IP字段时选择UNSIGNED INT等
d.尽量将列设置成NOT NULL
e.尽量使用整型做主键,应该尽量避免字符串类型作为标识列,因为它们很消耗空间,并且通常比数字类型慢
f.字段给定默认值,不设为null
g.业务表拆分, 分为业务基本表和业务扩展表
h.不使用触发器
i.尽量避免使用游标,因为游标的效率较差
3.使用索引和索引的优化
一.使用索引为什么快?
就好比书的目录,想要找到某一个内容,直接看目录便可找到对应的页
二.索引的存储结构:B+tree和hash
一般选择B+tree
三.索引的类型
按作用分类:
按数据存储结构分类:聚簇索引和非聚簇索引
四.索引优化
避免索引失效:
4.SQL优化
一.sql语句
二.使用Explain分析sql查询语句,选择更好的索引和写出更优化的查询语句
三.开启慢日志,定期查看慢查询日志记录,定位慢查询的sql,进而优化代码
5.架构优化
分库分表(垂直,水平)
分库分表是有成本的
任何分库分表的行为都会提升业务逻辑的复杂度,数据库除了承载数据的存储和访问外,协助业务更好地实现需求和逻辑也是其重要的工作之一。分库分表会带来数据的合并、查询、更新条件的分离,以及事物的分离等多种后果,业务实现的复杂度往往会翻倍或指数级上升。所以在分表分库之前,应先升级硬盘、内存、CPU、网络、版本、读写分离、负载均衡及SQL语句优化。
垂直分表一般是将表中的列按照相关性拆分开
水平分表是按照hash或者时间拆分出来不同的表,每张表的结构是一样的
缓存
mysql本身是有缓存机制的,如果开启了查询缓存,我们在查询的时候就会先去缓存查询,但此处的缓存不是指mysql本身的缓存,因为mysql缓存不能减少客户端对mysql的请求访问,因此我们可以在其他地方做缓存,本地或者redis都是很好的选择,合理加上这些缓存,能有效减轻mysql数据库压力。
6.配置优化
数据库配置优化
Linux系统中MySQl配置文件一般位于/etc/my.cnf
常用配置参数:
innodb_buffer_pool_size【用于配置Innodb的缓冲池,如果数据库中只有Innodb表,则推荐配置量为总内存的75%】
innodb_buffer_pool_instances【MySQL5.5中新增参数,可以控制缓冲池的个数,默认情况下只有一个缓冲池】
innodb_flush_log_at_trx_commit【关键参数,对innodb的IO影响很大。默认值为1,可以取0,1,2三个值,0最快,1最安全,2折中。一般建议设为2,但如果数据安全性要求比较高则使用默认值1】
操作系统配置优化
网络方面的配置,要修改/etc/sysctl.conf文件
增加tcp支持的队列数
net.ipv4.tcp_max_syn_backlog = 65535
减少断开连接时 ,资源回收
net.ipv4.tcp_max_tw_buckets = 8000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 10
标签:实现 地方 表示 条件 否则 全文索引 长度 优化 判断
原文地址:https://www.cnblogs.com/jackzhuo/p/12915955.html