mysql优化参考(一)-数据结构与概览

一、无监控不性能

  • show profile(s) [set profiling=1]
  • performance_schema
  • (show) processlist

二、数据更小的数据

  • varchar
    • 满足需求的最小数据类型(存储数据大小和占用空间大小是不一样的)
    • 空间占用更小
  • char
    • 最大长度 255
    • 查询自动清除尾部的空字符
    • 读写查询性能更好
  • datetime
    • 占用8字节
    • 时区无关(不依赖数据库设置的时区)
    • 毫秒级数据存储,保存范围大
  • timestamp
    • 占用4字节
    • 秒级数据存储,范围:1970-01-01~2038-01-19
    • 采用整型存储
    • 依赖数据库设置的时区
    • 可自动更新timestamp的值,如创建或更新字段时候触发
  • date
    • 3字节
    • 日期函数操作
    • 范围:1000-01-01~9999-12-31
  • 用int替换string,用date替换string
  • 用enum枚举替换string(实际存储的是数值,对于客户端是一样的,优点是:存储的空间占用小,枚举猜测是维护到表信息中)
  • CREATE TABLE `t1` (
      `id` int(11) DEFAULT NULL,
      `type` enum('game','app') DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 用整型代替ip的字符串表示(通过函数),【注:如果需要检索就不太合适】
    • select inet_aton('192.168.1.1');
      select inet_ntoa('3232235777');
  • 避免null(优化空间较小)

三、范式与反范式

  • 3范式的作用:减少冗余
    • 第一范式:表中的列只能含有原子性(不可再分)的值   如地址:包含了省 市 区
    • 第二范式:满足第一范式,没有部分依赖  1对多关系,如果将订单的信息存在订单项中,则会存在一些重复的信息
    • 第三范式:满足第二范式,没有传递依赖  每个列要直接依赖主键,而不是间接
  • 反范式:增加冗余,空间换查询性能

四、主键

  • 自然主键 如身份证号,订单号等
  • 代理主键 如自增ID  ->更容易维护,但这个看具体业务要求

五、字符集的选择

  • utf-8(2字节),可以单独对表字段设置utf8mb4(但尝试只对字段设置无法保存emjoy表情,修改了表的字符集之后才能正常存储:参考版本mysql5.7)
  • utf8mb4(emjoy表情)

六、存储引擎(数据文件的组织形式)

  • innoDB
  • MyIsAM

参考比较

  MyisAM InnoDB
支持事务
支持表锁
支持行锁
支持外键
支持全文索引 5.6+
适合操作类型 大量select 大量del、update、insert

七、适当的数据冗余

  • 需要统计才能计算出的数据(数据延迟,旧数据问题)
  • 需要多表join的数据(数据维护问题)

八、适当拆分

  • 水平拆分:日期、区域等字段或规则进行拆分
  • 垂直拆分:单表拆成多表,一般适用于附加属性的同时查询次数比较少,主属性查询次数频繁的情况
原文地址:https://www.cnblogs.com/gabin/p/13706621.html