MySQL优化总结

★【单表优化】思路

【表设计】开始,字段尽量精确,避免过多字段,避免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。

开启慢查询日志

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

mysql设置时区

mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0

mysql5.6 分页查询优化

mysql5.6分页查询优化场景:表结构:主键(非自增)contentCode(varchar),过滤条件列为updateTime(timeStamp),已经为timestamp建立索引。搜索sql为:SELECTFROMmy_hello_tableWHEREupdat