MySQL高性能优化规范建议

一定不要用字符串存储日期:

对于日期类型来说, 一定不要用字符串存储日期。可以考虑 DATETIME、TIMESTAMP 和 数值型时间戳。

这三种种方式都有各自的优势,根据实际场景选择最合适的才是王道。下面再对这三种方式做一个简单的对比,以供大家实际开发中选择正确的存放时间的数据类型:

|-----------|---------|----------------------------------|-----------------------------------------------------------------|---------|
| 类型 | 存储空间 | 日期格式 | 日期范围 | 是否带时区信息 |
| DATETIME | 5~8 字节 | YYYY-MM-DD hh:mm:ss[.fraction] | 1000-01-01 00:00:00[.000000] ~ 9999-12-31 23:59:59[.999999] | 否 |
| TIMESTAMP | 4~7 字节 | YYYY-MM-DD hh:mm:ss[.fraction] | 1970-01-01 00:00:01[.000000] ~ 2038-01-19 03:14:07[.999999] | 是 |
| 数值型时间戳 | 4 字节 | 全数字如 1578707612 | 1970-01-01 00:00:01 之后的时间 | 否 |

在编程中,不建议用字符串存储日期主要有以下几个原因:

1,数据操作不便

2,数据准确性难以保证

3,性能问题

同财务相关的金额类数据必须使用 decimal 类型:

  • 非精准浮点:float,double
  • 精准浮点:decimal

decimal 类型为精准浮点数,在计算时不会丢失精度。占用空间由定义的宽度决定,每 4 个字节可以存储 9 位数字,并且小数点要占用一个字节。并且,decimal 可用于存储比 bigint 更大的整型数据

不过, 由于 decimal 需要额外的空间和计算开销,应该尽量只在需要对数据进行精确计算时才使用 decimal 。

单表不要包含过多字段

如果一个表包含过多字段的话,可以考虑将其分解成多个表,必要时增加中间表进行关联

索引设计规范:

限制每张表上的索引数量,建议单张表索引不超过5个

索引并不是越多越好!索引可以提高效率同样可以降低效率。

索引可以增加查询效率,但同样也会降低插入和更新的效率,甚至有些情况下会降低查询效率。

因为 MySQL 优化器在选择如何优化查询时,会根据统一信息,对每一个可以用到的索引来进行评估,以生成出一个最好的执行计划,如果同时有很多个索引都可以用于查询,就会增加 MySQL 优化器生成执行计划的时间,同样会降低查询性能。

禁止使用全文索引:

全文索引不适用于 OLTP 场景

禁止给表中的每一列都建立单独的索引:

5.6 版本之前,一个 sql 只能使用到一个表中的一个索引,5.6 以后,虽然有了合并索引的优化方式,但是还是远远没有使用一个联合索引的查询方式好。

每个InnoDB表必须有主键:

InnoDB 是一种索引组织表:数据的存储的逻辑顺序和索引的顺序是相同的。每个表都可以有多个索引,但是表的存储顺序只能有一种。

InnoDB 是按照主键索引的顺序来组织表的

  • 不要使用更新频繁的列作为主键,不使用多列主键(相当于联合索引)
  • 不要使用 UUID,MD5,HASH,字符串列作为主键(无法保证数据的顺序增长)
  • 主键建议使用自增 ID 值

常见索引列建议

  • 出现在 SELECT、UPDATE、DELETE 语句的 WHERE 从句中的列
  • 包含在 ORDER BY、GROUP BY、DISTINCT 中的字段
  • 并不要将符合 1 和 2 中的字段的列都建立一个索引, 通常将 1、2 中的字段建立联合索引效果更好
  • 多表 join 的关联列

如何选择索引列的顺序:

建立索引的目的是:希望通过索引进行数据查找,减少随机 IO,增加查询性能 ,索引能过滤出越少的数据,则从磁盘中读入的数据也就越少。

  • 区分度最高的放在联合索引的最左侧(区分度=列中不同值的数量/列的总行数)
  • 尽量把字段长度小的列放在联合索引的最左侧(因为字段长度越小,一页能存储的数据量越大,IO 性能也就越好)
  • 使用最频繁的列放到联合索引的左侧(这样可以比较少的建立一些索引)
相关推荐
alden_ygq2 分钟前
etcd网关
服务器·数据库·etcd
张声录15 分钟前
【ETCD】ETCD Leader 节点写入数据流程概览
数据库·etcd
Elastic 中国社区官方博客15 分钟前
Elasticsearch:什么是查询语言?
大数据·数据库·elasticsearch·搜索引擎·oracle
听见~1 小时前
SQL优化
数据库·sql
苹果醋31 小时前
SpringBoot快速入门
java·运维·spring boot·mysql·nginx
ROCKY_8171 小时前
Mysql复习(一)
数据库·mysql
夜光小兔纸1 小时前
oracle dblink 的创建及使用
数据库·oracle
WANGWUSAN661 小时前
Python高频写法总结!
java·linux·开发语言·数据库·经验分享·python·编程
Smile丶凉轩1 小时前
MySQL库的操作
数据库·mysql·oracle
我自飞扬临天下2 小时前
Mybatis-Plus快速入门
数据库·mybatis-plus