MySQL 规范及优化
一、建库建表优化
1、核心规范(推荐)
- 表字符集选择UTF8 (“表情”字段单独设置为其他字符集)
- 存储引擎使用INNODB
- 不在库中存储图片、文件等
- 使用可变长字符串(varchar)
- 每张表数据量控制在5000W以下
2、字段命名规范(建议)
- 库名、表名、字段名、索引名使用小写字母,以下划线分割
- 非唯一索引按照“idx_字段名[_字段名]”进行命名
- 唯一索引按照“uniq_字段名[_字段名]”进行命名(不要直接采用字段名称定义索引名称。防止删除索引时,误删除字段)
3、字段属性规则(建议)
- 所有字段均定义为 NOT NULL(null会降低索引效果;索引会产生额外的空间)
- ·使用unsigned存储非负整数
- ·使用timestamp存储时间(可利用该类型的默认值,进行查询优化)
4、字段类型规则(推荐)
- 使用tinyint来代替enum类型
- 尽可能不用text、blob类型
- 将字符转化为数字
- 存储 “abcd” 时 varchar(5) 比 varchar(10) 更优
5、索引规则(推荐)
- 选择自增列作为主键
- 单表索引数不超过5个、单个索引字段数不超过5个
- 字符串可使用前缀索引,前缀长度控制在5-8个字符
- 不在低基数列上建立索引,如:性别、是否删除、是否发布
- 不使用select * 优化成 select id,name,age……..
- 不在索引列进行数学运算、函数
6、SQL规范
- 避免隐式转换
- 避免使用存储过程、触发器、函数
- 避免进行数学运算
- 尽可能拆分大SQL
二、建立高效索引
目的:加速查询、加速排序、覆盖索引(只需要在索引中完成查询,不需要回到表中)
1、主键:和数据存储在一起。
- 通常选择自增列作为主键
- 优点:
- a 顺序插入,不会出现数据页内数据移动的情况发生(插入更快)
- b 数据存储更紧凑(查询更快)
- 缺点:
- 多出4至8字节无意义的数据
2、二级索引:和数据分开存储
- 二级索引中是按照索引列+主键的对应关系进行存储的,每多一个索引就会多一个这样的对应关系。所以索引的个数越多,占用空间越大,在插入、删除的时候会越慢。
3、什么样的字段适合加索引?
- 首先,要满足主要功能的查询条件。
- 其次,要看该字段的唯一值多少。
- 唯一值: select count(distinct uid)/count(1) from table; 值越大,索引效果越好。
type :建议优化的类型
- system 表只有一行
- const 用到的是主键或唯一索引
- ref 匹配到了多行,通常是利用的普通索引(如果是联合唯一索引,只用到了其中1个也是这个类型)
- ref_or_null 与ref类似,条件中用到了 null 的搜索
eq_ref 多表查询时,匹配到了1行,并且利用的是主键或唯一索引
- all 没有用到索引
- 出现上面所列之外的类型时,如range、index等说明用到的索引性能很差
rows:
- 查询影响的行数,值越小越优。
extra:
- 查询的详细信息,类型包括:
- using where、using index、using filesort等都是正常查询过程
- using temporary 出现时,说明需要对sql或索引进行优化
二、优化SQL
- 需要多表查询时,内(外)连接查询不一定是最佳的方案,适当的采用子查询,会是更好的选择。
- 把 select * 换成部分字段,可少许降低查询时间
- 垃圾索引只会影响插入、删除效率,对查询速度影响较小。
- 字段唯一性太低,索引效率不高。
- 字段唯一性非常高,索引的性能会很优秀。
- 时间范围很大时,用不到索引。尽可能让时间范围有开口和闭口,区间也不易过大,根据数据量及最早时间来决定。
MySQL 规范及优化的更多相关文章
- mysql设计与优化以及数据库表设计与表开发规范
一.设计问题? 1.主键是用自增还是UUID ? Innodb 中的主键是聚簇索引. 如果主键是自增的,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的 ...
- 第 10 章 MySQL Server 性能优化
前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化,但不包括mysqld之外的比如存储引擎相关的 ...
- MySQL查询性能优化(精)
MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...
- MySql(十):MySQL性能调优——MySQL Server性能优化
本章主要通过针对MySQL Server( mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化,但不包括mysqld之外的比如存储引擎相关的参数优 ...
- 170727、MySQL查询性能优化
MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...
- 到底该不该使用存储过程 MySQL查询性能优化一则
到底该不该使用存储过程 看到<阿里巴巴java编码规范>有这样一条 关于这条规范,我说说我个人的看法 用不用存储过程要视所使用的数据库和业务场景而定的,不能因为阿里巴巴的技术牛逼,就视 ...
- mysql库表优化实例
一.SQL优化 1.优化SQL一般步骤 1.1 查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; Com_select:执行SELECT操作的次数,一次查询累加1.其他类似 以下 ...
- 基于MySQL 的 SQL 优化总结
文章首发于我的个人博客,欢迎访问.https://blog.itzhouq.cn/mysql1 基于MySQL 的 SQL 优化总结 在数据库运维过程中,优化 SQL 是 DBA 团队的日常任务.例行 ...
- MySQL“被动”性能优化汇总!
年少不知优化苦,遇坑方知优化难. --村口王大爷 本文内容导图如下: 我之前有很多文章都在讲性能优化的问题,比如下面这些: <switch 的性能提升了 3 倍,我只用了这一招!> < ...
随机推荐
- ansible的modules
fetch :从远端服务器拉取文件到本地 dest 依赖 本地存放拉取到的文件路径, 如果flat=yes,则会在该路径下直接存放文件, 如果flat=no,则会在该路径下生成每个服务器的in ...
- java文件过滤器的使用
前言: java.io.FileFilter(过滤器接口)boolean accept(File pathname) File类提供了如下方法使用过滤器:public File[] listFiles ...
- 小游戏canvas直接操作ImgaeData时的几个优化点
前不久在处理一个canvas绘图需求时,经过不断测试优化,将重绘一帧的时间由400ms降低至20ms左右,基本满足了要求.特此记录一下优化方向. 设备环境:Android,360*720,pixelR ...
- 分布式缓存技术之Redis_04Redis的应用实战
目录 1 Redis Java客户端的使用 Jedis 单点连接 Jedis sentinel连接哨兵集群 Jedis sentinel源码分析 Jedis Cluster分片环境连接 Jedis C ...
- vue分类筛选方法,filer
使用computed 方法来过滤筛选数据;也可以使用methods 方式来筛选过滤数据 代码如下: <body> <div id="app"> <ul ...
- 源生API解析XML文档与dom4j解析XML文档
一.XML语言 XML是一种可扩展的标记语言,是一种强类型的语言,类似HTML(超文本标记语言,是一种弱类型的语言).XML是一种通用的数据交换格式(关系型数据库),综上所诉:XML可以传输数据,也可 ...
- 浅谈C#常用集合类的实现以及基本操作复杂度
List 集合类是顺序线性表,Add操作是O(1)或是O(n)的,由于List的容量是动态扩容的,在未扩容之前,其Add操作是O(1),而在需要扩容的时候,会拷贝已存在的那些元素同时添加新的元素,此时 ...
- scrapy初始和简单应用
什么是Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有 ...
- 获取JSON格式的树形
需求:前端需要一个JSON格式的Tree,例如组织机构维护的时候使用到的,需要一次性返回给前端.所以编写了一个算是半通用的查询方法 1.数据库Dao层: /** * 根据父ID获取子数据 * @par ...
- Dockerfile中COPY命令的简单性
dockerfile中的COPY命令是不会拷贝目录结构的,它只会单纯把包含的所有文件拷贝到另一个目录中去. 相关链接:https://www.cnblogs.com/sparkdev/p/957324 ...