联合索引:多字段组合索引,加速组合条件查询
联合索引要满足从左到右的查询需求,例如(a,b,c)的联合索引,能够加速 a|(a,b)|(a,b,c) 三组查询需求。但不能满足 b|(b,a)等查询需求。
in查询
select * from where 索引字段 in (xxx,yyy) 能够命中索引
or查询
select * from where 索引字段 = xxx or 索引字段 = yyy
只有新版本的MySql能够命中索引
!=查询 肯定不能命中索引 (包括not in、not exists)
枚举项少的字段不宜作为索引
代码里使用enum不要用String,enum占用空间小且效率高。
明确知道只有一条结果,使用limit 1能够提高效率。
计算不要放到数据库层,放到上游应用层,能够增加命中查询缓存几率,另外应用层的计算性能可以做增加集群水平扩展,数据库擅长的是存储与索引。
多次调用相同的sql,能够命中查询缓存。
禁止使用存储过程、视图、触发器、Event。
大型文件只存放url
表的主键要递增,数据行写入可以提高插入性能,可以避免索引page分裂,减少表碎片提升空间和内存的使用
主键要选择较短的数据类型, Innodb引擎普通索引都会保存主键的值,较短的数据类型可以有效的减少索引的磁盘空间,提高索引的缓存效率。
详见mysql索引B+树结构介绍:http://hedengcheng.com/?p=525
禁止使用外键,约束性靠应用控制。
外键会导致表与表紧耦合,update或delete影响sql性能,会造成死锁。不使用外键,使用最终一致性牺牲强一致性,换取性能
必须把字段定义为NOT NULL并且提供默认值
- null的列使索引/索引统计/值比较都更加复杂,对MySQL来说更难优化
- 对null 的处理时候,只能采用is null或is not null,而不能采用=、in、<、<>、!=、not in这些操作符号。如:where name!=’shenjian’,如果存在name为null值的记录,查询结果就不会包含name为null值的记录
网友评论