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+树,更新频繁的字段倡议索引会大大降低数据库性能。
相似于性别这类辨别不大的属性,建设索引是没有意义的,不能无效的过滤数据。