N叉树、page_size、数据库严格模式修改、数据库中delect和drop的不同

“N叉树”的N值在MySQL中是可以被人工调整吗?

其中有两种方法调整:

1、通过改变key值来调整

N 叉树中非叶子节点存放的是索引信息,索引包含 Key 和 Point 指针。Point 指针固定为 6 个字节,假如 Key 为 10 个字节,那么单个索引就是 16 个字节。如果 B + 树中页大小为 16 K,那么一个页就可以存储 1024 个索引,此时 N 就等于 1024。我们通过改变 Key 的大小,就可以改变 N 的值。

2、通过改变页的大小

页越大,一页存放的索引就越多,N 就越大。数据页调整后,如果数据页太小层数会太深,数据页太大,加载到内存的时间和单个数据页查询时间会提高,需要达到平衡才行。

Mysql的page页

页是InnoDB存储引擎磁盘管理的最小单位,每个页默认16KB;InnoDB存储引擎从1.2.x版本碍事,可以通过参数innodb_page_size将页的大小设置为4K、8K、16K。若设置完成,则所有表中页的大小都为innodb_page_size,不可以再次对其进行修改,除非通过mysqldump导入和导出操作来产生新的库。

InnoDB逻辑存储单元主要分为表空间、段、区和页。层级关系为tablespace -> segment -> extent(64个page,1M) -> page。

innodb_page_size的官方描述:

其中:

  • 第一个系统表空间数据文件(ibdata1)的最小文件大小取决于innodb_page_size值

  • innodb_page_size只能在初始化MySQL实例之前配置,不能在之后修改。如果没有指定值,则使用默认页面大小初始化实例。

  • MySQL 5.7增加了对32KB和64KB页面大小的支持。对于32KB和64KB的页面大小,最大行长度约为16000字节。当innodb_page_size设置为32KB或64KB时,不支持ROW_FORMAT= compression。对于innodb_page_size=32k,区段大小为2MB。对于innodb_page_size=64KB,区段大小为4MB。当使用32KB或64KB的页面大小时,innodb_log_buffer_size应该至少设置为16M(默认)。

  • 默认的16KB或更大的页面大小适用于各种工作负载,特别是涉及表扫描的查询和涉及批量更新的DML操作。对于涉及许多小写操作的OLTP工作负载,较小的页面大小可能更有效,在这种工作负载中,当单个页面包含许多行时,可能会出现争用问题。对于通常使用较小块的SSD存储设备,较小的页面也可能是有效的。保持InnoDB页面大小接近存储设备块大小,可以最大限度地减少被重写到磁盘的未更改数据量。

在严格模式下导致MySQL5.7插入用户表的方式新建用户失败,如何修改严格模式让他修改成功?

mysql> set @@explicit_defaults_for_timestamp = 1;

1.此时如果 TIMESTAMP 列没有显示的指定 not null 属性,那么默认的该列可以为 null ,此时向该列中插入 null 值时,会直接记录 null 。

2.如果 TIMESTAMP 列被加上了 not null 属性,并且没有指定默认值。这时如果向表中插入记录,但是没有给该 TIMESTAMP 列指定值的时候,如果 strict sql_mode 被指定了,那么会直接报错。如果 strict sql_mode 没有被指定,那么会向该列中插入 ’0000-00-00 00:00:00’ 并且产生一个 warning 。

去掉sql_mode中的 NO_ZERO_IN_DATE,NO_ZERO_DATE 。

SQL语句:mysql> set @@sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

这里也可修改 MySQL 配置文件来去除规则,没有配置文件在 /etc/mysql 下创建 my.cnf 配置文件sudo vi /etc/mysql/my.cnf

在 [mysqld] 区域添加:sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

如:[mysqld]

sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

最后重启服务器,即可正常执行创建语句。
 

数据库中delect和drop的不同

Delect语句用于删除表中的行:

DELETE FROM 表名称 WHERE 列名称 = 值

删除所有航:

DELETE * FROM table_name

Drop语句,可以轻松地删除索引、表和数据库。

DROP TABLE 语句用于删除表(表的结构、属性以及索引也会被删除):

DROP TABLE 表名称

DROP DATABASE 语句用于删除数据库:

DROP DATABASE 数据库名称

两种删除语句的区别:

1、DELETE是DML,执行DELETE操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大,需要手动提交(commit)操作才能生效,可以通过rollback撤消操作。DROP是DDL,会隐式提交,所以,不能回滚,不会触发触发器。

2、DELETE可根据条件删除表中满足条件的数据,如果不指定where子句,那么删除表中所有记录。DROP语句删除表结构及所有数据,并将表所占用的空间全部释放。

3、DELETE语句不影响表所占用的extent,高水线(high watermark)保持原位置不变。DROP语句将删除表的结构所依赖的约束,触发器,索引,依赖于该表的存储过程/函数将保留,但是变为invalid状态。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小元.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值