一、建库建表优化

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              用到的是主键或唯一索引
      • eq_ref            多表查询时,匹配到了1行,并且利用的是主键或唯一索引

      • ref                   匹配到了多行,通常是利用的普通索引(如果是联合唯一索引,只用到了其中1个也是这个类型)
      • ref_or_null     与ref类似,条件中用到了 null 的搜索
      • all                   没有用到索引
      • 出现上面所列之外的类型时,如range、index等说明用到的索引性能很差

    rows:

      • 查询影响的行数,值越小越优。

      extra: 

      • 查询的详细信息,类型包括:
      • using where、using index、using filesort等都是正常查询过程
      • using temporary 出现时,说明需要对sql或索引进行优化

二、优化SQL

  • 需要多表查询时,内(外)连接查询不一定是最佳的方案,适当的采用子查询,会是更好的选择。
  • 把 select * 换成部分字段,可少许降低查询时间
  • 垃圾索引只会影响插入、删除效率,对查询速度影响较小。
  • 字段唯一性太低,索引效率不高。
  • 字段唯一性非常高,索引的性能会很优秀。
  • 时间范围很大时,用不到索引。尽可能让时间范围有开口和闭口,区间也不易过大,根据数据量及最早时间来决定。

MySQL 规范及优化的更多相关文章

  1. mysql设计与优化以及数据库表设计与表开发规范

    一.设计问题? 1.主键是用自增还是UUID ? Innodb 中的主键是聚簇索引. 如果主键是自增的,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的 ...

  2. 第 10 章 MySQL Server 性能优化

    前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化,但不包括mysqld之外的比如存储引擎相关的 ...

  3. MySQL查询性能优化(精)

    MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...

  4. MySql(十):MySQL性能调优——MySQL Server性能优化

    本章主要通过针对MySQL Server( mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化,但不包括mysqld之外的比如存储引擎相关的参数优 ...

  5. 170727、MySQL查询性能优化

    MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...

  6. 到底该不该使用存储过程 MySQL查询性能优化一则

    到底该不该使用存储过程   看到<阿里巴巴java编码规范>有这样一条 关于这条规范,我说说我个人的看法 用不用存储过程要视所使用的数据库和业务场景而定的,不能因为阿里巴巴的技术牛逼,就视 ...

  7. mysql库表优化实例

    一.SQL优化 1.优化SQL一般步骤 1.1 查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; Com_select:执行SELECT操作的次数,一次查询累加1.其他类似 以下 ...

  8. 基于MySQL 的 SQL 优化总结

    文章首发于我的个人博客,欢迎访问.https://blog.itzhouq.cn/mysql1 基于MySQL 的 SQL 优化总结 在数据库运维过程中,优化 SQL 是 DBA 团队的日常任务.例行 ...

  9. MySQL“被动”性能优化汇总!

    年少不知优化苦,遇坑方知优化难. --村口王大爷 本文内容导图如下: 我之前有很多文章都在讲性能优化的问题,比如下面这些: <switch 的性能提升了 3 倍,我只用了这一招!> < ...

随机推荐

  1. Jmeter函数助手

    1.__Random:产生0-10之间的随机数[__RadomString:随机生成字符函数同__Random]

  2. vue v-for循环的用法

    1.v-for循环普通数组 ①创建vue对象 ② 循环数据 结果: 2.v-for循环对象数组 ① 创建vue实例对象 ② 循环对象数组 结果: 3.v-for循环对象 ①创建vue对象实例 ②循环对 ...

  3. hbase_1

    常见的RDBMS:(数据库排行) ** mysql --开源[社区版] .收费[企业版] --市场占有率高.web领域被广泛使用 ** 2008年被oracle收购 ** mysql主从架构[集群的一 ...

  4. Jmeter选项含义

    最近接了组里压测的任务,开始仔细钻研Jmeter了.之前也压过,但每次RD问压测的指标等问题,感觉都很懵不知道该怎么回答.借这个机会一鼓作气搞明白吧! Jmeter安装插件 有个插件叫jp@gc St ...

  5. DBUtils - Python数据库连接池

    flask没有ORM操作这一功能, 但是想要操作数据库怎么办呢, 使用第三方包DBUtils 查询需要SQL原生语句! DBUtils 第一步还是要下载 使用pycharm直接搜索DBUtils fr ...

  6. MySql由于编码问题,存储过程执行出错。

    在存储过程后面加了一段话.红色部分 DELIMITER $$ USE `mysql_wispeed01-test1`$$ DROP PROCEDURE IF EXISTS `sp_crebillno` ...

  7. python爬取珞珈1号卫星数据

    首先登录珞珈一号数据系统查询想要的数据 利用浏览器审查元素获取包含下载信息的源码 将最右侧的table相关的网页源码copy到剪切板备用 利用python下载数据 ## utf-8 import re ...

  8. [POJ2823]Sliding Window 滑动窗口(单调队列)

    题意 刚学单调队列的时候做过 现在重新做一次 一个很经典的题目 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗 ...

  9. Http_4个新的http状态码:428、429、431、511

    1.428 Precondition Required (要求先决条件) 先决条件是客户端发送 HTTP 请求时,必须要满足的一些预设条件.一个好的例子就是 If-None-Match 头,经常用在 ...

  10. 找一个数组的最大和的连续子数组(时间复杂度 O(n))(二)

    要求: 要求数组从文件读取. 如果输入的数组很大,  并且有很多大的数字,  就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出. 另外, 如果输入文件的参数有错误, 这个程序应该 ...