zoukankan      html  css  js  c++  java
  • 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的数据(数据维护问题)

    八、适当拆分

    • 水平拆分:日期、区域等字段或规则进行拆分
    • 垂直拆分:单表拆成多表,一般适用于附加属性的同时查询次数比较少,主属性查询次数频繁的情况
  • 相关阅读:
    [calss*="col-"]匹配类名中包含col-的类名,^以col-开头,$以col-结尾
    插件写法之脚本运行环境,mac和window检测
    @media only screen and (max-width:640px)中的问题,响应式布局
    webpack2的配置属性说明entry,output,state,plugins,node,module,context
    npm ERR! missing script: dev 报错解决
    [jshint] 'import' is only available in ES6 (use 'esversion: 6'). (W119) 提示import等ES6语法的jshint错误的,在代码前加一行 /* jshint esversion: 6 */
    Uncaught TypeError: (intermediate value)(...) is not a function 上一个方法结束没有加分号; 代码解析报错
    LeetCode 1. two sum
    redis集群尝试
    服务器搭建私人Git
  • 原文地址:https://www.cnblogs.com/gabin/p/13706621.html
Copyright © 2011-2022 走看看