首页 > 数据库 >MySQL

MySQL

时间:2023-02-26 00:44:06浏览次数:47  
标签:存储 varchar MySQL 字符串 长度 255

MySQL

MySQL执行流程

客户端向MySQL发起请求(一般使用数据库连接池减少线程的开关)

MySQL Server开始执行

  • 连接器: 控制用户的连接

  • 分析器: 词法分析, 语法分析

  • 优化器: 优化SQL语句, 规定执行流程

    • 可以查看SQL语句的执行计划, 可以采用对用的优化点, 来加快查询
  • 执行器: SQL语句的实际执行组件

存储引擎: 不同的存放位置, 不同的文件格式

  • InnoDB: 磁盘

    • 支持事务, 性能比较好. 具有自动崩溃恢复机制, 支持行锁, 创建数据库时, 默认是innodb
  • MyISAM: 磁盘

    • 5.1及老版本默认的, 支持表锁. 不支持事务, 不支持行锁, 崩溃后不能保证安全恢复. 只针对读操作, 表比较小. 表锁导致的性能问题
  • memory: 内存

    • 访问速度快, 重启或崩溃数据丢失. 可以当成redis使用, hash索引, 查找单个数据速度快, 支持表锁, 不支持TEXT/BLOG大文本, 并且是固定长度, 比较浪费空间

      • 查找单个数据速度快

      • 查找单个数据速度快

      • 查找单个数据速度快

  • Archive

    • 只能insert和select. 缓存所有写, 并且zlib插入数据库中. 适合日志的采集
  • blackhole

    • 不会存储任何的数据, 不会有任何保存. insert into, 表的日志. 备份表(插入日志. 不推荐使用)
  • Ferderated

    • 一个远程到mysql服务器的客户端连接(SQL -> Ferderated -> 远程另外一台服务执行): 默认禁掉

打开profile, 查看SQL语句执行流程所耗费的时间

  • set profiling=1;

  • show profile all for query [ID]

  • select * from xxx;

新版本出现更好的分析引擎performance_schema

查看MySQL客户端连接数信息

  • show processlist;

schema与数据优化

数据类型的优化

  • 更小的通常更好

    一般情况下,应该尽量使用可以正确存储数据的最小数据类型 。更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期也更少。

  • 简单就好

    简单数据类型的操作通常需要更少的CPU周期。

    例如,整型比字符操作代价更低,因为字符集和校对规则使字符比较复杂与整型比较。
    例如,使用Mysql的內建类型而不是字符串来存储日期和时间。
    例如:用整型存储IP地址。

    • 整数int的类型区分

      1. tinyint 8bit 1个字符
      2. smallint 16bit 2个字符
      3. mediumint 24bit 3个字符
      4. int 32bit 4个字符
      5. bigint 64bit 8个字符
    • 记录货币使用什么字段类型

      • decimal

        decial是精准的货币类型, 但是在存储的时候转成字符串, 但是性能有影响

      • double

        不精准

      • bigint

        将系统中的货币*100存成整数类型

    • 谈一谈字符串类型

      • varchar

        可变长的字符串, 当存储不知道具体长度时, 使用varchar, 节约空间.
        并且额外需要1-2个字节需要记录字符串的长度

        • varchar位数的区别 #进行中

          varchar(5) 和 varchar(200) 在存储的时候有没有差异?
          答: 没有差异, 因为是变长的

          但是如果varchar(255)大于255以上的时候, 记录长度的会使用2个字节, 剩下的没有差别

          55:29

      • char

        char是定长的, 当存储的字段的值是固定的情况下

  • 尽量避免NULL

    如果计划在列上建索引,就应该尽量避免设计成可为NULL 的列。因为一列中, 每一个NULL值都是唯一的(NULL = NULL 结果是false)InnoDB使用单独的一位(bit)存储NULL值,所以对于稀疏数据 有很好的空间效率。并且NULL值很难被优化

合理使用范式和反范式

  • 范式

    • 优点

      • 范式化的更新通常比反范式要快

      • 当数据较好的范式化后, 很少或者没有重复的数据

      • 范式化的数据比较小, 可以放在内充中, 操作比较快

      • 减少数据的冗余

    • 缺点

      • 通常需要进行关联
  • 反范式

    • 优点

      • 所有的数据都在同一张表中, 可以避免关联

      • 可以设计有效的索引

    • 缺点

      • 表格内的冗余较多, 删除数据时候会造成表有用的信息丢失

使用MySQL枚举类型替代字符串: 减少空间占用, 原理是枚举中有对应的字符串, 实际存储是MySQL生成的整形值, 比如("aaa"), 那么aaa在数据库中存储的就可能是1

datetime和timestamp

  • timestamp

    • 占用4个字节

    • 时间范围:1970-01-01到2038-01-19

    • 精确到秒

    • 采用整形存储

    • 依赖数据库设置的时区

    • 自动更新timestamp列的值

  • date

    • 占用的字节数比使用字符串、datetime、int存储要少,使用date类型只需要3个字节

    • 使用date类型还可以利用日期时间函数进行日期之间的计算

    • date类型用于保存1000-01-O1到9999-12-31之间的日期

  • datetime

    • 占用8个字节

    • 与时区无关,数据库底层时区配置,对datetime无效

    • 可保存到毫秒

    • 可保存时间范围大

    • 不要使用字符串存储日期类型,占用空间大,损失日期类型函数的便捷性

文本和字符串类型

  • varchar

    • 使用最小的符合需求的长度。

    • varchar(n) n小于等于255使用额外一个字节保存长度,n>255使用额外两个字节保存长度。

    • varchar(5)与varchar(255)保存同样的内容,硬盘存储空间相同,但内存空间占用不同,是指定的大小。

    • varchar在mysql5.6之前变更长度,或者从255一下变更到255以上时时,都会导致锁表。

    • 应用场景

      • 存储长度波动较大的数据,如:文章,有的会很短有的会很长

      • 字符串很少更新的场景,每次更新后都会重算并使用额外存储空间保存长度

      • 适合保存多字节字符,如:汉字,特殊字符等

  • char固定长度的字符串

    • 最大长度:255

    • 会自动删除未尾的空格

    • 检索效率、写效率会比varchar高,以空间换时间

    • 应用场景

      • 存储长度波动不大的数据,如: md5摘要

      • 存储短字符串、经常更新的字符串

通过索引优化

主键的选择

  • 代理主键

    • 与业务无关的,无意义的数字序列
  • 自然主键

    • 事物属性中的自然唯一标识
  • 推荐使用代理主键

    • 它们不与业务耦合,因此更容易维护

    • 一个大多数表,最好是全部表,通用的键策略能够减少需要编写的源码数量,减少系统的总体拥有成本*

标签:存储,varchar,MySQL,字符串,长度,255
From: https://www.cnblogs.com/m-bianbian/p/17155794.html

相关文章

  • Golang基于Mysql分布式锁实现集群主备
    背景集群中如果需要主备,可以基于Redis、zk的分布式锁等实现,本文将介绍如何利用Mysql分布式锁进行实现。原理数据库中包含数据字段(此处为Master的主机名)、版本号和上......
  • 7.mysql索引失效
       失效的七字口诀:模型数空运最快模:模糊查询以%开始索引失效;型:数据类型转换函数:函数的索引空:索引列为空不走索引,运:对索引列进行加减乘除会失效最:不按聚合索......
  • pymysql操作
    1、首相导入模块pymysql importpymysql2、创建连接 conn=pymysql.connect( host='远程数据库IP地址', port=远程数据库端口, user='数据库账号', password......
  • 为什么在连接mysql时,设置 SetConnMaxIdleTime 没有作用
    目录测试1go1.15.15go1.17.12测试2go1.15.15go1.17.12参考在使用golang连接mysql时,为了节省连接资源,在连接使用过后,希望在指定长度时间不再使用后,自动关闭连接。这......
  • mysql描述关键字
    SHOWCOLUMNS要求给出一个表名(这个例子中的FROMtab_1),它对每个字段返回一行,行中包含字段名、数据类型、是否允许NULL、键信息、默认值以及其他信息。   另外可以......
  • 908~909Maven工程环境修改,Maven的Java工程取mysql数据库数据
    Maven工程环境修改<plugins><plugin><!--https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin-->......
  • MySQL学习笔记-数据控制语言
    SQL-数据控制语言(DCL)DCL语句用于管理数据库用户,控制数据库的访问权限一.管理用户1.查询用户#访问mysql数据库usemysql;#查询user表select*fromuser;主......
  • PyMySQL删除
    title:PyMySQL删除author:杨晓东permalink:PyMySQL删除date:2021-10-0211:27:04categories:-投篮tags:-demoPyMySQLMySQL数据库_删除"""1、删除操作......
  • MYSQL的索引、并发控制、各种事务介绍以及日志管理
    今天分享的是mysql数据库中的索引、并发控制、各种事务介绍以及日志管理,在学习过程中对这些内容的理解INDEX索引索引介绍索引:是排序的快速查找的特殊数据结构,定义作为查找......
  • 三天吃透MySQL八股文(2023最新整理)
    本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校......