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的数据(数据维护问题)

    八、适当拆分

    • 水平拆分:日期、区域等字段或规则进行拆分
    • 垂直拆分:单表拆成多表,一般适用于附加属性的同时查询次数比较少,主属性查询次数频繁的情况
  • 相关阅读:
    Effective Java 的笔记(二)
    设计模式系列 装饰模式
    一道多线程题目的解决方案
    Effective Java 的笔记(一)
    Java 并发编程实践
    【转】微博技术底层架构的实现
    Head First JavaScript 笔记
    JVM 学习笔记 类的加载和执行
    背包问题
    Oracle 序列号通过定时任务重置
  • 原文地址:https://www.cnblogs.com/gabin/p/13706621.html
Copyright © 2011-2022 走看看