精华内容
下载资源
问答
  • 其实本章主要讲一下mysql的日志、关联查询join的内部衍生的算法以及优化方案。一、mysql的主从复制 master(主服务器)写入 binlog日志事件通知 slave(从服务器)slave的 ...二、binlog以上暴露除了一个点 什么是 b...

    其实本章主要讲一下mysql的日志、关联查询join的内部衍生的算法以及优化方案。

    一、mysql的主从复制

    ce00d76b76589fff556245edaa14ce4d.png

    master(主服务器)写入 binlog日志

    1. 事件通知 slave(从服务器)
    2. slave的 IO Thread 读取binlog并 写入relay log
    3. SQL Thread 读取 relay log 同步到数据库

    以上就是数据(日志)的同步过程。

    二、binlog

    以上暴露除了一个点 什么是 bin log?

    1、定义

    bin log是MySQL的二进制日志,可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。

    2、使用场景

    • MySQL Replication在Master端开启binlog,Mster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。 (就是上面第一点主从复制)
    • 自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。

    三、Join原理

    咱们在做关联查询的时候,经常用到join,其内部使用的是NestedLoopJoin算法。

    NestedLoopJoin算法有三种实现算法:

    • Simple Nested-Loop Join(简单的嵌套循环连接)
    • Index Nested-Loop Join(索引嵌套循环连接)
    • Block Nested-Loop Join(缓存块嵌套循环连接)

    1、Simple Nested-Loop Join

    简单来说嵌套循环连接算法就是一个双层for 循环 ,通过循环外层表的行数据,逐个与内层表的所有行数据进行比较来获取结果;

    例如:select * from user tb1 left join level tb2 on tb1.id=tb2.user_id;

    d52b538cf2f5dfb0316ec5c5521bd59e.png

    “交叉相乘”得到的最后的数据就是算法返回的数据,也就是咱们进行管理查询,忘记加条件时查询出来的数据。

    即“笛卡尔积”。

    90c147d9efc46a3ff2e3fa4011b69c63.png

    最后的数据量=表A数据量 × 表B数据量 ×…… 。可见最后的数据量是多么的庞大。

    2、Index Nested-Loop Join

    索引嵌套循环连接其优化的思路 主要是为了减少内层表数据的匹配次数;简单来说Index Nested-Loop Join 就是通过外层表匹配条件 直接与内层表索引进行匹配,避免和内层表的每条记录去进行比较, 这样极大的减少了对内层表的匹配次数;

    从原来的匹配次数=外层表行数 * 内层表行数 ==变成了==> 外层表的行数 * 内层表索引的高度,极大的提升了 join的性能。

    例如: 两张表 user[id pk,……] level[user_id,……]

    select * from user tb1 left join level tb2 on tb1.id=tb2.user_id

    原先的是 循环次数=user数据量 * level数据量

    变成了 循环次数=user数据量 * level索引高度

    d52be3c28d6a8e5bda266627d79cd375.png

    3、Block Nested-Loop Join

    缓存块嵌套循环连接其优化思路是减少外层表的循环次数;

    Block Nested-Loop Join 通过一次性缓存多条数据,把参与查询的列缓存到join buffer 里,,然后拿join buffer里的数据批量与内层表的数据进行匹配,从而减少了外层循环的次数;

    当我们不使用Index Nested-Loop Join的时候,默认使用的是Block Nested-Loop Join。

    55d4f4f59113c348ab25ae7bf2234155.png

    解释:使用缓存区一次缓存多少数据作为一次的匹配(缓存区中的数据库一次匹配完毕)。

    匹配次数 变成 总匹配次数= 缓存次数 * 表2数据量。

    那么缓存块缓存的数据量越多,则最后循环的次数越少。

    四、数据库优化方案

    一般来说,咱们优化有很多种的方案或者方向,现在总结一下:

    1. 业务优化
    2. 表结构优化(数据库优化)
    3. 表索引优化(数据库优化)
    4. SQL优化

    1、业务优化

    一把来说,跟业务相关的优化,都是业务优化。业务上的问题一般需要产品修改需求。

    主要优化方面:减少不必要的业务需求,优化设计方案。

    2、表结构优化

    • 选择合适的字段类型
    • 精确字段长度
    • 适当利用冗余字段(减少连表查询、减少计算);
    • 把字段定义为NOT NULL并且提供默认值
    • 禁止存储大文件或者大照片
    • 禁止使用外键

    3、表索引优化

    • 在合适的字段上建索引(离散性不高、查询频率不高、更新频率高的字段不适合建索引);
    • 组合索引区分度高的字段放在前面(最左匹配原则)
    • 单表索引不能过多(在5个以内)

    注意:什么是离散型?

    离散性指的就是数据重复(相似)情况,数据字段的数据重复情况越少,离散型高;重复情况越多,离散性越低。

    例如:性别,离散性基本上是最低的,因为只有两种情况,以后可能出现第三种情况。

    4、SQL优化

    SQL优化的情况很多,我这是简单介绍几种优化方案:

    • 只取需要的列,避免SELECT *
    • 禁止使用属性隐式转换
    • 禁止在WHERE条件的属性上使用函数或者表达式
    • 避免使用or查询
    • 联表查询用小结果集驱动大结果集
    • 禁止负向查询(NOT、!=、<>、!<、!>、NOT IN、NOT LIKE),以及%开头的模糊查询

    注意:为什么不提倡 使用 *

    • 不能使用索引(查询索引字段)
    • 数据量大,网络传输会变慢(查询少量字段的时候)
    • 需要进行SQL解析
    • join buffer缓存的数据量会减少(查询少量字段的时候)
    • 出现覆盖索引情况

    参考网站:

    mysql的binlog文件:https://www.cnblogs.com/martinzhang/p/3454358.html

    展开全文
  • 一个很low的问题,为啥数据库字段要指定长度?我发现公司内部很多组件的数据库,没有指定长度。 如果不指定长度,数据库在存储的时候都必须给每个字段预留最大的存储空间,极大的浪费了空间,也加大了数据库本身的...

    一个很low的问题,为啥数据库字段要指定长度?我发现公司内部很多组件的数据库,没有指定长度。

    如果不指定长度,数据库在存储的时候都必须给每个字段预留最大的存储空间,极大的浪费了空间,也加大了数据库本身的管理难度。一般推荐是:用多少,申请多少。

    展开全文
  • 1.在创建数据库的时候int(10),varchar(255)中括号后面的数字代表什么意思?括号里的数字叫数据的宽度,单数不同的数据类型对宽度的处理也不一样:1、整数类型,这里显示的宽度和数据类型的取值范围没有任何关系的...

    1.在创建数据库的时候int(10),varchar(255)中括号后面的数字代表什么意思?

    括号里的数字叫数据的宽度,单数不同的数据类型对宽度的处理也不一样:

    1、整数类型,这里显示的宽度和数据类型的取值范围是没有任何关系的,显示宽度只是指明Mysql最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;如果插入了大于显示宽度的值,只要该值不超过该类型的取值范围,数值依然可以插入,而且能够显示出来。

    例如上面的udi,显示的宽度是4,但是我向uid中插入100001,也是可以的,保存和显示的都会是100001

    如果你不设置宽度,系统将添加默认的宽度 tinyint(4),smallint(6),mediumint(9),int(11),bigint(20),这些默认的宽度是跟该类型的取值范围长度相关。

    2、字符串类型,字符串类型这个宽度才真的用上了。不管是char还是varchar,宽度都定义了字符串的最大长度

    例如上面的 password varchar(20),如果你输入了一个21个字符的密码,那么保存和显示的只会是前20个字符,你将丢失一个字符信息,char同理。由于varchar是变长存储的,所以实际开发中我们一般都把varchar的宽度设为最长255,反正你没用完它也不会浪费空间。

    3、浮点和日期等数据类型对数据的宽度没有要求,一般也不设置,默认是0

    2.char 和 varchar的区别

    char:定长,不足的补位

    varchar:变长

    3.大小怎么计算的

    4个字节 32位

    2.31-1

    int类型的范围跟带不带符号有关:

    带符号:(-2 147 483 648,2 147 483 647)

    不带符号:(0,4 294 967 295)

    3.varchar能存多少汉字

    一个汉字占多少长度与编码有关:

    UTF-8:一个汉字=3个字节

    GBK:一个汉字=2个字节

    展开全文
  • 数据库字段长度单位是什么 -- 字符 如果在utf8的字符集下 指的是字节。解释:字符可以分为中文字符,英文字符、数字。中文字符(中文输入下的汉字和特殊字符都包含)占两个字节。英文字符(大写字母和小写字母)...

    数据库里字段长度单位是什么  -- 字符 如果在utf8的字符集下

    指的是字节。
    解释:
    字符可以分为中文字符,英文字符、数字。
    中文字符(中文输入下的汉字和特殊字符都包含)占两个字节。
    英文字符(大写字母和小写字母)占一个字节。
    数字也是占一个字节。

    疑问:

    不是说utf-8是一个汉字3个字节么 那为什么MySQL字段的字节是2个字节一个汉字呢 ?

    http://zhidao.baidu.com/link?url=LWXy__hhAU4IYjbqSGBw-313NX5TBFAnhgnkUeoLWsSyx3EO4FGDg5vDC1LmCPP0h3b-nswJvH_rYM1SBilLKq

    ---其实后来问了一下李捷老师 发现字段的长度就是字符数 一个汉字就是一个字符数一个字母也是一个字符数 varchar(1) 也是可以弄的

    转载于:https://www.cnblogs.com/qinqiu/p/5711034.html

    展开全文
  • 数据库int类型字段长度的含义

    万次阅读 2015-06-30 12:45:17
    数据库中创建一张表时,要设置各字段的数据“类型”和“长度”。 如:varchar(10)表示长度上限为10的字符串。 但是int(10)是什么含义? int类型由32位二进制数表示,占4字节内存,与“长度”无关。 经百度(1....
  • 什么要合理的设计数据库字段?一个降低物理上的存储空间,一个提高数据库的处理速度,还有一个附带功能能校验数据是否合法。对于任何字段长度都不应该过于小气,否则未知的变化会造成前后台都要修改1、对于...
  • 疑问的原因没启用MySQL的严格模式(strict mode),很多快捷开发...非严格模式下,MySQL会容忍许多开发上的疏忽,例如把一个长度100的字符串插入到varcaht中只会截断多余的部分而不报错。严格模式对数据的格式、长...
  • 以为这样就将数据库备份了,然后回家一粘贴,发现根本不好使,用PHPMYADMIN一看,等于白看,我压根就不知道那些错误提示是什么东西,没办法,只能重建一个数据库。还是用phpmyadmin建的,测试一下我的超级留言本...
  • 今天简单说说mysql字段不同类型的长度,显示宽度,数据存储占用硬盘大小首先来说最常用的整型,mysql的整型又分为五种小类型:1、tinyint2、smallint3、mediumint4、int5、bigint这五种整型的主要区别是数据库存储的...
  • 疑问的原因没启用MySQL的严格模式(strict mode),很多快捷开发环境自带的MySQL(PHPnow WAMP Appserv等),都没有启用严格模式,甚至在一些产品环境(production environment)都忽略了这点。非严格模式下,MySQL会...
  • 所以,从Oracle的角度看:应用程序SQL查询主要对于只读(Read-Only)对象或者变化较小(Read-Mostly)的数据库对象。 初始化参数RESULT_CACHE_MODE用来控制Result Cache功能的开启工作模式,默认MANUAL。 MANUAL表示...
  • 其实当我们在选择使用int的类型的时候,不论int(3)还是int(11),它在数据库里面存储的都4个字节的长度,在使用int(3)的时候如果你输入的10,会默认给你存储位010,也就是说这个3代表的默认的一个长度,当你...
  • 定义一个包含未确定长度的URL的字段的最佳做法是什么?10个解决方案281 votes流行的Web浏览器中最低公分母最大URL长度:2,083(Internet Explorer)[http://dev.mysql.com/doc/refman/5.0/en/char.html]VARCHAR列中的...
  • 计算机是二进制计算的,1 bytes = 8 bit ,一个字节最多可以代表的数据长度是2的8次方 11111111 在计算机中也就是-128到127。 而varchar类型存储变长字段的字符类型,当存储的字符串长度小于255字节时,其需要1字节的...
  • Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也用两个字节表示 如果还为了这个纠结,就直接看看后面的解说,做决定吧。...答:varchar(n)长度
  •  设计数据库的时候,遇到了字段的类型用char,varchar和nvarchar的问题。下面小编就来讲解一下。 是什么  char是定长的,也就是无论你输入的字符多长,它都是制定的数目的长度。例如char(5),你输入的字符小于5...
  • 经过分析发现,在Access数据库中,name这个字段长度是15,因为我知道Access中,长度15代表可以存放中文或英文最长15个字符。可“帅!是不需要理由”只有8个字符为什么显示的时候,只显示了7个呢。我想可能是因为在...
  • 数据库在修改字段的时候,在修改索引键字段长度时候,出现了这个问题,现在说明一下。 最近比较懒,这就去网上找到了这个,终于明白了是什么原因。 原文如下: 系统变量innodb_large_prefix开启了,则对于使用...
  • 数据库保存图片用什么字段

    千次阅读 2011-05-18 14:36:19
    参考: raw(n) n=1 to 2000 可变长二进制数据,在具体定义字段的时候必须指明最大长度n,Oracle 8i用这种格局来保存较小的图形文件或带格局的文本文件,如...可变长二进制数据,最大长度是2GB。Oracle 8i...
  • 精品文档 精心整理 Mysql数据库精深 Mysql基础常识 无符号与有符号 unsigned与signed代表无符号和有符号两种状态当定义一个字段类型的时候默认状态下有符号的比如一个有符号类型变量他的长度范围可以-...
  • 问题: 数据库字段中phone 类型为 int 20. 然后将封装入参的 dto 对象中的 phone 字段改为 int. 结果 前台传入的 11位字符串类型的数字无法转换为 int.原因: 因为 java 中和 mysql 中的 int 类型最大值 ...
  • 在使用MySQL进行数据库表设计时,遇到一个字符串字段,需要很大的长度。于是,字段类型用varchar,长度想当然的填上65535,结果报错。如下图所示。 上网查询,原来长度65535表示的字节数,并不字符数。 什么...
  • 我们如何知道,我们访问的数据库的表,有哪些字段字段的类型是什么长度限制是什么? 在实际工作中,我就遇到过,要做动态sql,比如insert,如果是数字就不要加引号,如果是字符就要加引号,还比如做基于数据库...
  • 什么数据库表字段要限制长度

    千次阅读 2019-06-29 18:55:00
    解释:变长字段定义的长度虽然不会影响服务器数据空间大小,但是对于客户端的内存有影响,因为客户端在用SQL从数据库读取数据时,首先会取到字段定义的长度,然后分配足够的内存,也就是说如果你定义的字段长度是1K...
  • 在写入数据库的时候,某字段varchar(20),报“字符长度超长”的错误,但是去数据库中用length()查,发现最大的长度都不超20,为什么会报这个错呢? 那因为length()查的字符数,而varchar(20)字节数。 ...
  • 今天遇到的一个关于字段长度校验的问题,起初作为多年从事java编程的我来说,处理字段长度还不是小事一桩么? 真的如此吗?坑还是有的。1、oracle数据库varchar2长度类型对于数字、字母和中文有所不同。具体的还得...
  • 当所插入的字符串超出它们的长度时,视情况来处理,如果严格模式,则会拒绝插入 并提示错误信息,如果宽松模式,则会截取然后插入。如果插入的字符串长度小于定义长 度时,则会以不同的方式来处理,如 char...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 402
精华内容 160
关键字:

数据库字段长度是什么