★【单表优化】思路
【表设计】开始,字段尽量精确,避免过多字段,避免null。
【存储引擎】选择好。
【索引】设计好。
【查询优化】,between和exists优于in的使用;union all 比union的效率高。
【表分区】的使用。
上面属于单表优化的思路。如果还不能满足需求,就只能选择对数据库层级进行操作了(比如垂直拆分和水平拆分)。
表设计
可预知情况下字段尽量准确
尽量使用TINYINT、SMALLINT、MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED
VARCHAR的长度只分配真正需要的空间
使用枚举或整数代替字符串类型
尽量使用TIMESTAMP而非DATETIME
单表不要有太多字段,建议在20以内,去掉无用的字段
避免使用NULL字段,很难查询优化且占用额外索引空间
存储引擎--MyISAM和InnoDB
索引
索引列区分度要高
联合索引的区分度要看几个索引的联合。
字符型索引可以使用前缀索引(考虑区分度要高)。
索引列不能参与计算
会失效。
建立联合索引,并注意联合索引中各个字段的顺序
索引就是用空间换取时间,要占用存储空间的。
查询优化
避免使用 select *
in(1,2,3,4) 可以用 between 1 and 4来代替
尽量使用 exists 而非 in
union all 比 union 效率要高,而且尽早的union
表分区
按月进行表分区实践。
系统级工具
使用explain****
rows是核心指标,绝大部分rows小的语句执行一定很快。所以优化语句基本上都是在优化rows。