schema 与数据类型优化
整数类型:
能够应用的几种整数类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT 别离应用 8,16,24,32,64 位存储空间。尽量应用满足需要的最小数据类型。
整型比字符操作代价更低,因为字符集和校对规定是字符比拟比整型比拟更简单。
字符和字符串类型
char 是定长,varchar 是可变长度,varhcar 尽管比 char 节俭空间,然而如果一个 varchar 列常常被批改,而且每次被批改的数据长度不同,会引起 行迁徙 景象,这会造成多余的 I /O。所以varchar 实用于存储长度稳定较大的数据,且很少更新的场景,char 实用于长度不变,短且常常更新的字符串,如:MD5 摘要。
应用 mysql 自建类型而不是字符串来存储日期和工夫
应用枚举类型代替字符串
有时能够应用枚举类代替罕用的字符串类型,mysql 存储枚举类型会十分紧凑,会依据列表值的数据压缩到一个或两个字节中,mysql 在外部会将每个值在列表中的地位保留为整数,并且在表的.frm 文件中保留“数字 - 字符串”映射关系的查找表。
非凡类型数据
应用整型存储 IP 地址,mysql 给出了现成的转换函数:
select INET_ATON(“192.15.2.2”)
select INET_NTOA(“3222209026”)
适当拆分
当咱们的表中存在相似于 TEXT 或者是很大的 VARCHAR 类型的大字段的时候,如果咱们大部分拜访这张表的时候都不须要这个字段,咱们就该义无反顾的将其拆分到另外的独立表中,以缩小罕用数据所占用的存储空间。这样做的一个显著益处就是每个数据块中能够存储的数据条数能够大大增加。
正当应用范式和反范式
被频繁援用且只能通过 Join 2 张 (或者更多) 大表的形式能力失去的独立小字段。
这样的场景因为每次 Join 仅仅只是为了获得某个小字段的值,Join 到的记录又大,会造成大量不必要的 IO,齐全能够通过空间换取工夫的形式来优化。毛病是,冗余的同时须要确保数据的一致性,此字段如果要产生批改,要同时更新两张表。
索引
索引生效的几种状况
含糊查问时通配符放在最后面(like ‘%XX’ 或者 like ‘%XX%’)
索引不容许为 null,所以 where 的判断条件如果对字段进行了 null 值判断,将导致数据库放弃索引而进行全表查问
select id from t where num is null
能够在 num 上设置默认值 0,确保表中 num 列没有 null 值,而后这样查问:
select id from t where num=0
a. 索引是有序的。NULL 值进入索引时,无奈确定其应该放在哪里。(将索引列值进行建树,其中必然波及到诸多的比拟操作,null 值是不确定值无奈比拟,无奈确定 null 呈现在索引树的叶子节点地位。)
where 前面的索引列应用了!= 或者 <> 操作符
where 前面的索引列进行了表达式或函数操作
组合索引没有遵循最左匹配准则
索引优化
尽量利用笼罩索引机制,防止回表,缩小 I / O 次数
尽量应用主键查问,防止回表,缩小 I / O 次数
在须要索引很长的字符串的时候应用前缀索引
前缀索引是一种能使索引更小更快的无效办法,然而毛病是:mysql 无奈应用前缀索引作 order by 和 group by
尽量应用索引来做排序
更新非常频繁,数据区分度不高的字段不适宜建索引
更新会变更 B + 树,更新频繁的字段倡议索引会大大降低数据库性能。
相似于性别这类辨别不大的属性,建设索引是没有意义的,不能无效的过滤数据。