数据库其它调优策略

定位调优方式

1、用户反馈(主要)

2、日志分析(主要):查看数据库日志和操作系统日志等

3、监控服务器资源:CPU、内存、I/O 等使用情况,实时了解服务器的性能使用,与历史情况进行对比

4、监控数据库内部状况:在数据库的监控中,活动会话(Active Session)监控是一个重要的指标,了解数据库当前是否处于非常繁忙的状态,是否存在 SQL 堆积等

5、其它:监控事务、锁等待

 

调优的维度和步骤

1、选择适合 DBMS

2、优化表设计

(1)表结构要尽量遵循三范式的原则,让数据结构更加清晰规范,减少冗余字段,减少更新、插入、删除数据时等异常情况的发生

(2)如果查询应用比较多,尤其多表联查,采用反范式进行优化,通过增加冗余字段提高查询的效率

(3)一般来说,如果字段可以采用数值类型,就不要采用字符类型,字符长度要尽可能设计短

3、优化逻辑查询

(1)SQL查询优化分为:逻辑查询优化、物理查询优化

(2)首先考虑逻辑查询优化,通过改变 SQL 内容让 SQL 执行效率更高效,采用的方式是对 SQL 语句进行等价变换,对查询进行重写

(3)SQL 查询重写包括:子查询优化、等价谓词重写、视图重写、条件简化、连接消除、嵌套连接消除等

4、优化物理查询

(1)确定逻辑查询优化之后,采用物理优化技术(比如:索引等),通过计算代价模型对各种可能的访问路径进行估算,从而找到执行方式中代价最小的作为执行计划

(2)重点是对索引的创建和使用

(3)SQL 查询时需要对不同的数据表进行查询,需要确定这些查询所采用的路径,包括以下具体情况

(4)单表扫描:可以全表扫描,也可以局部扫描

(5)两张表的连接:常用的连接方式包括嵌套循环连接、HASH 连接、合并连接

(6)多张表的连接:多张数据表进行连接时,顺序很重要,因为不同的连接路径查询的效率不同,搜索空间也会不同,进行多表连接时,搜索空间可能会达到很高的数据量级,巨大的搜索空间显然会占用更多的资源,因此我们需要通过调整连接顺序,将搜索空间调整在一个可接受的范围内

5、使用 Redis 或 Memcached 作为缓存

(1)提高援存提升查询的效率

(2)从数据库层中取出数据,放到内存中进行业务逻辑的操作,当用户量增大时,如果频繁地进行数据查询,会消耗数据库的很多资源,如果将常用的数据直接放到内存中,就会大幅提升查询的效率

(3)常用的键值存储数据库:Redis、Memcached

(4)从可靠性来说,Redis 支持持久化,使数据保存在硬盘上,性能消耗也比较大;Memcached 仅仅是内存存储,不支持持久化

(5)从支持的数据类型来说,Redis 比 Memcached 要多,它不仅支持 key-value 类型的数据,还支持 List、Set、Hash 等数据结构,当有持久化需求或更高级的数据处理需求时,可以使用 Redis,若是简单  key-value 存储,则使用 Memcached

(6)通常对于查询响应要求高的场景(响应时间短,吞吐量大),可以考虑内存数据库

6、库级优化

(1)控制一个库中的数据表数量

(2)单一数据库存在限制,通过主从架构优化读写策略,通过对数据库进行垂直或水平切分,突破单—数据库或数据表的访问限制,提升查询的性能

(3)读写分离:主数据库(master)完成写操作,从数据库(slave)完成读操作

image-20220606104510351

image-20220606104533516

(4)数据分片:把一个数据库切成多份,放到不同的数据库服务器上,减少对单一数据库服务器的访问压力,MySQL 自带分区表功能,可以自己做垂直拆分(分库)、水平拆分(分表)、垂直 + 水平拆分(分库分表),提升数据库性能,同时增加维护和使用成本

image-20220606104607899

image-20220606104619376

7、优化 MySQL 服务器

(1)对硬件优化

(2)对 MySQL 服务的参数进行优化

 

优化服务器硬件

1、配置较大的内存

(1)足够大的内存提高 MySQL 数据库性能,内存的速度比磁盘 I/O 快

(2)通过增加系统的缓冲区容量,使数据在内存中停留的时间更长,以减少磁盘 I/O

2、配置高速磁盘系统

3、合理分布磁盘 I/O,把磁盘 I/O 分散在多个设备上,以减少资源竞争,提高并行操作能力

4、配置多处理器,MySQL 是多线程的数据库,多处理器可同时执行多个线程

 

优化 MySQL 参数

1、MySQL 服务的配置参数都在 my.cnf 或 my.ini 文件的 [mysqld] 组中,配置完参数以后,需要重新启动 MySQL 服务才会生效

2、innodb_buffer_pool_size

(1)InnoDB 类型的表和索引的最大缓存,不仅缓存索引数据,还会缓存表的数据

(2)值越大,查询速度越快,值太大会影响操作系统的性能

3、key_buffer_size

(1)表示索引缓冲区的大小,索引缓冲区是所有的线程共享,增加索引缓冲区可以得到更好处理的索引(对所有读和多重写)

(2)大小取决于内存的大小,值太大,导致操作系统频繁换页,降低系统性能,对于内存在 4GB 左右的服务器,该参数可设置为 256M 或 384M

4、table_cache

(1)表示同时打开的表的个数

(2)值越大,同时打开的表的个数越多

(3)物理内存越大,设置就越大,同时打开的表太多会影响操作系统的性能

(4)默认为 2402M,512M - 1024M 最佳

5、query_cache_size

(1)表示查询缓冲区的大小

(2)如果 Qcache_lowmem_prunes 值非常大,则表明经常出现缓冲不够的情况,需要增加 query_cache_size的值

(3)如果 Qcache_hits 值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓存

(4)如果 Qcache_free_blocks 值非常大,则表明缓冲区中碎片很多,MySQ L8.0 之后失效,该参数需要和 query_cache_type 配合使用

6、query_cache_type

(1)query_cache_type=0,所有的查询都不使用查询缓存区,但是不会导致 MySQL 释放 query_cache_size 所配置的缓存区内存

(2)query_cache_type=1,所有的查询都将使用查询缓存区,除非在查询语句中指定 SQL_NO_CACHE

(3)query_cache_type=2,只有在查询语句中使用 SQL_CACHE 关键字,查询才会使用查询缓存区

(4)使用查询缓存区可以提高查询的速度,只适用于修改操作少,且经常执行相同的查询操作的情况

7、sort_buffer_size

(1)表示每个需要进行排序的线程分配的缓冲区的大小

(2)增加这个参数的值,可以提高 ORDER BY 或 GROUP BY 操作的速度

(3)默认数值是 2097144 字节(约 2MB),对于内存在 4GB 左右的服务器推荐设置为 6M-8M

(4)该参数对应的分配内存是每个连接独享,如果有 100 个连接,那么实际分配的总共排序缓冲区大小为 100 *  6 = 600MB

8、join_buffer_size

(1)表示联合查询操作所能使用的缓冲区大小

(2)和 sort_buffer_size 相同,该参数对应的分配内存也是每个连接独享

9、read_buffer_size

(1)表示每个线程连续扫描时,为扫描的每个表分配的缓冲区的大小(字节)

(2)当线程从表中连续读取记录时需要用到这个缓冲区,默认为 64K,可以设置为 4M

10、innodb_flush_log_at_trx_commit

(1)表示何时将缓冲区的数据写入日志文件,并且将日志文件写入磁盘中

(2)该参数的默认值为 1

(3)值为 0 时,表示每秒 1 次的频率,将数据写入日志文件,并将日志文件写入磁盘,每个事务的 commit 并不会触发前面的任何操作,该模式速度最快,但不太安全,mysqld 进程的崩溃会导致上一秒钟所有事务数据的丢失

(4)值为 1 时,表示每次提交事务时,将数据写入日志文件,并将日志文件写入磁盘进行同步,该模式最安全的,但也最慢,因为每次事务提交,或事务外的指令都需要把日志写入(flush)硬盘

(5)值为 2 时,表示每次提交事务时,将数据写入日志文件,每隔 1 秒将日志文件写入磁盘,该模式速度较快,也比 0 安全,只有在操作系统崩溃,或系统断电的情况下,上一秒钟所有事务数据才可能丢失

11、innodb_log_buffer_size

(1)InnoDB 事务日志所使用的缓冲区

(2)为了提高性能,先将信息写入 Innodb Log Buffer 中,当满足 innodb_flush_log_trx_commit 参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件(或者同步到磁盘)

12、max_connections

(1)表示允许连接到 MySQL 数据库的最大数量,默认值是 151

(2)如果状态变量 connection_errors_max_connections 不为零,并且一直增长,则说明不断有连接请求,因数据库连接数已达到允许最大值而失败,可以考虑增大 max_connections 值

(3)连接数不是越大越好,过多的连接可能会导致 MySQL 服务器僵死

13、back_log

(1)控制 MySQL 监听 TCP 端口时,设置的积压请求栈大小

(2)如果 MySSQL 连接数达到 max_connections 时,新请求将会被存在堆栈中,以等待某一连接释放资源

(3)如果等待连接的数量超过 back_log,将不被授予连接资源,将会报错

(4)5.6.6 版本之前默认值为 50,之后版本默认为 50+(max_connections / 5),对于 Linux 系统,推荐设置为小于 512 整数,但最大不超过 900

(5)如果需要数据库在较短的时间内处理大量连接请求,可以考虑适当增大 back_log 值

14、thread_cache_size

(1)线程池缓存线程数量的大小

(2)当客户端断开连接后,将当前线程缓存起来,当在接到新的连接请求时,快速响应无需创建新的线程

(3)对使用短连接的应用程序,可以极大的提高创建连接的效率

(4)为了提高性能可以增大该参数的值,默认为 60,可以设置为 120

(5)MySQL 线程池的状态值:Threads_cached、Threads_connected、Threads_created、Threads_running

15、wait_timeout

(1)指定一个请求的最大连接时间

(2)对于 4GB 内存的服务器可以设置为 5-10

16、interactive_timeout:表示服务器在关闭连接前等待行动的秒数

17、innodb_buffer_pool_instances

(1)可以将 InnoDB 缓存区分成几个部分,可以提高系统并行处理能力,因为可以允许多个进程同时处理不同部分的缓存区

(2)建议值 64,同时有多个进程进行数据操作,CPU 效率高

18、my.cnf 参考配置

[mysqld]
port = 3306
serverid = 1
socket = /tmp/mysql.sock
#避免MySQL的外部锁定,减少出错几率增强稳定性
skip-locking
#禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求  
skip-name-resolve
back_log = 384
key_buffer_size = 256M
max_allowed_packet = 4M
thread_stack = 256K
table_cache = 128K
sort_buffer_size = 6M
read_buffer_size = 4M
read_rnd_buffer_size=16M
join_buffer_size = 8M
myisam_sort_buffer_size =64M
table_cache = 512
thread_cache_size = 64
query_cache_size = 64M
tmp_table_size = 256M
max_connections = 768
max_connect_errors = 10000000
wait_timeout = 10
thread_concurrency = 8
#开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项!否则将无法正常连接
skip-networking
table_cache=1024
#默认为2M
innodb_additional_mem_pool_size=4M
innodb_flush_log_at_trx_commit=1
#默认为1M
innodb_log_buffer_size=2M
#服务器物理CPU有多少个就设置为几
innodb_thread_concurrency=8
#默认为16M,调到64M-256M最挂
tmp_table_size=64M
thread_cache_size=120
query_cache_size=32M

 

拆分表

1、冷热数据分离

2、思路:把 1 个包含很多字段的表,拆分成 2 个或多个相对较小的表

3、原因:表中某些字段的操作频率很高(热数据),经常要进行查询或者更新操作,而另外一些字段的使用频率却很低(冷数据),冷热数据分离,可以减小表的宽度

4、MySQL 限制每个表最多存储 4096 列,并且每一行数据的大小不能超过 65535 字节,表越宽,把表装载进内存缓冲池时,所占用的内存也就越大,消耗更多 l/O

5、目的

(1)减少磁盘 I/O,保证热数据的内存缓存命中率

(2)更有效的利用缓存,避免读入无用的冷数据

 

增加中间表

1、对于需要经常联合查询的表,可以建立中间表以提高查询效率

2、通过建立中间表,把需要经常联合查询的数据插入中间表中,然后将原来的联合查询改为对中间表的查询,以此来提高查询效率

(1)分析经常联合查询表中的字段

(2)使用这些字段建立一个中间表,并将原来联合查询的表的数据插入中间表中

(3)使用中间表来进行查询

3、同步数据

(1)方式一:清空数据 -> 重新添加数据

(2)方式二:使用视图

 

增加冗余字段

1、设计数据库表时,应尽量遵循范式理论的规约,尽可能减少冗余字段,但合理地加入冗余字段可以提高查询速度

2、表的规范化程度越高,表与表之间的关系就越多,需要连接查询的情况也就越多,尤其在数据量大,而且需要频繁进行连接的时候,为了提升效率,可以考虑增加冗余字段来减少连接

 

优化数据类型

1、考虑系统整体的稳定性和效率,优先选择符合存储需要的最小的数据类型

2、列的字段越大,建立索引时所需要空间越大,一页中所能存储的索引节点的数量越少,在遍历时所需要 I/O 次数越多,索引的性能越差

3、对整数类型数据进行优化

(1)遇到整数类型的字段使用 INT,INT 型数据有足够大的取值范围,不用担心数据超出取值范围的问题

(2)对于非负型的数据(如自增 ID、整型 IP),优先使用无符号整型 UNSIGNED 存储,因为无符号相对于有符号,同样的字节数,存储的数值范围更大

4、既可以使用文本类型,也可以使用整数类型的字段,选择使用整数类型

(1)跟文本类型数据相比,大整数往往占用更少的存储空间

(2)在存取和比对时,可以占用更少的内存空间,如:IP 地址转换成整型数据

5、避免使用 TEXT、BLOB 数据类型

(1)MySQL 内存临时表不支持 TEXT、BLOB,如果查询中包含这样的数据,在排序等操作时,就不能使用内存临时表,必须使用磁盘临时表进行

(2)对于 TEXT、BLOB,MySQL 还要进行二次查询,使 SQL 性能变差

(3)如果一定要使用,建议把 BLOB 或 TEXT 分离到单独的扩展表中,查询时不要使用 SELECT *,只需要取出必要的列

6、避免使用 ENUM 类型

(1)修改 ENUM 值需要使用 ALTER 语句

(2)ENUM 的 ORDER BY 操作效率低,需要额外操作

(3)使用 TINYINT 代替 ENUM

7、使用 TIMESTAMP 存储时间

(1)TIMESTAMP 存储的时间范围:1970-01-01 00:00:01 ~ 2038-01-19-03:14:07

(2)TIMESTAMP 使用 4 字节,DATETIME 使用 8 个字节,同时 TIMESTAMP 具有自动赋值以及自动更新的特性

8、使用 DECIMAL 代替 FLOAT、DOUBLE 存储精确浮点数

 

优化插入记录的速度

1、插入记录时,影响插入速度的主要是索引、唯一性校验、一次插入记录条数等

2、以下分 MylSAM、IlnnoDB 情况

 

MyISAM

1、禁用索引

(1)对于非空表,插入记录时,MySQL 根据表的索引,对插入的记录建立索引

(2)如果插入大量数据,建立索引就会降低插入记录的速度

(3)可以在插入记录之前禁用索引,数据插入完毕后再开启索引

#禁用指定表的索引
ALTER TABLE 表名 DISABLE KEYS;
#开启指定表的索引
ALTER TABLE 表名 ENABLE KEYS;

2、禁用唯一性检查

(1)插入数据时,MySQL 对插入记录进行唯一性校验,唯一性校验会降低插入记录的速度

(2)可以在插入记录之前禁用唯一性检查,等到记录插入完毕后再开启 

#禁用唯一性检查
SET UNIQUE_CHECKS=0;
#开启唯一性检查
SET UNIQUE_CHECKS=1;

3、使用批量插入:插入多条记录时,一条 INSERT 插入多条记录,比多条 INSERT 插入多条记录快

4、使用 LOAD DATA INFILE 批量导入:LOAD DATAINFILE 导入数据的速度比 INSERT 快

 

InnoDB

1、禁用唯一性检查

(1)与 MyISAM 相同

(2)可以在插入记录之前禁用唯一性检查,等到记录插入完毕后再开启 

#禁用唯一性检查
SET UNIQUE_CHECKS=0;
#开启唯一性检查
SET UNIQUE_CHECKS=1;

2、禁用外键检查

(1)插入数据之前执行禁止对外键的检查,数据插入完成之后再恢复对外键的检查

#禁用外键检查
SET foreign_key_checks=0;
#恢复外键检查
SET foregin_key_checks=1;

3、禁止自动提交

(1)插入数据之前禁止事务的自动提交,数据导入完成之后,执行恢复自动提交操作

#禁止自动提交
SET autocommit=0;
#恢复自动提交
SET autocommit=1;

 

使用非空约束

1、在设计字段时,如果业务允许,建议尽量使用非空约束

2、进行比较和计算时,省去要对 NULL 值的字段判断是否为空的开销,提高存储效率

3、非空字段容易创建索引,因为索引 NULL 列需要额外的空间来保存,所以要占用更多的空间,使用非空约束,可以节省存储空间,每个字段 1 个bit

 

分析表

1、MySQL 提供 ANALYZE TABLE 语句分析表

ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名1[,表名2]……;

2、默认 MySQL 服务将 ANALYZE TABLE 语句写到 binlog 中,以便在主从架构中,从服务能够同步数据

3、可以添加参数 LOCAL 或 NO_WRITE_TO_BINLOG 取消将语句写到 binlog 中

4、使用 ANALYZE TABLE 分析表的过程中,数据库系统自动对表加一个只读锁,在分析期间,只能读取表中的记录,不能更新、插入记录

5、ANALYZE TABLE 能够分析 InnoDB、MyISAM 的表,但是不能作用于视图

6、ANALYZE TABLE 分析后的统计结果,反应到 cardinality 值

(1)该值统计表中某一键所在列不重复值的个数

(2)该值越接近表中的总行数,则在表连接查询或索引查询时,就越优先被优化器选择使用

(3)索引列 cardinality 值与表中数据的总条数差距越大,即使查询时使用该索引作为查询条件,存储引擎实际查询时使用的概率就越小

7、查看 cardinality

SHOW INDEX FROM 表名;

8、显示信息

(1)Table:表示分析的表的名称

(2)Op:表示执行的操作,analyze 表示分析,check 表示检查,optimize 表示优化

(3)Msg_type:表示信息类型,其值通常是状态(status)、信息(info)、注意(note)、警告(warning)、错误(error)之一

(4)Msg_text:显示信息

 

检查表

1、MySQL 可以使用 CHECK TABLE 语句来检查表

(1)能够检查 InnoDB、MyISAM 类型的表是否存在错误

(2)在执行过程中会给表加上只读锁

2、对于 MyISAM 表,CHECK TABLE 语句还会更新关键字统计数据。而且,CHECK TABLE 可以检查视图是否有错误,比如:在视图定义中被引用的表已不存在

3、基本语法

CHECK TABLE 表名1[, 表名2]……[option]……option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED};

(1)QUICK:不扫描行,不检查错误的连接

(2)FAST:只检查没有被正确关闭的表

(3)CHANGED:只检查上次检查后,被更改的表和没有被正确关闭的表

(4)MEDIUM:扫描行,以验证被删除的连接是有效的,也可以计算各行的关键字校验和,并使用计算出的校验和验证这一点

(5)EXTENDED:对每行的所有关键字进行一个全面的关键字查找,这可以确保表是 100% 一致的,但是时间较长

(6)option 只对 MyISAM 类型的表有效,对 InnoDB 类型的表无效

4、该语句对于检查的表可能会产生多行信息

(1)最后一行有一个状态(status)的 Msg_type 值,Msg_text 通常为 OK

(2)如果不是 OK,通常要对其进行修复;若为 OK 说明表已经是最新,即存储引擎对这张表不必进行检查

 

优化表

1、方式一:OPTIMIZE TABLE

(1)只能优化表中的 VARCHAR、BLOB、TEXT 类型的字段

(2)一个表包含以上数据类型的字段,若已经删除表的一大部分数据,或已经对含有可变长度行的表进行很多更新,则应使用 OPTIMIZE TABLE 来重新利用未使用的空间,并整理数据文件的碎片

2、OPTIMIZE TABLE 对 InnoDB、MyISAM 类型的表都有效,该语句在执行过程中会给表加上只读锁

(1)在 MyISAM 中,先分析表,再整理相关 MySQL datafile,然后回收未使用的空间

(2)在 InnoDB 中,回收空间是简单通过 Alter table 进行整理空间,在优化期间,MySQL 会创建一个临时表,优化完成之后会删除原始表,然后会将临时表 rename 成为原始表

3、基本语法

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名1 [, 表名2]……;

(1)LOCAL | NO_WRITE_TO_BINLOG关键字的意义和分析表相同,都是指定不写入二进制日志

(2)在多数的设置中,根本不需要运行 OPTIMIZE TABLE,即使对可变长度的行进行了大量的更新,也不需要经常运行, 每周一次或每月一次 即可,并且只需要对特定的表运行

4、方式二:使用 mysqlcheck 命令

mysqlcheck -o 数据库名 表名 -uroot -p

(1)mysqlcheck 是 Linux 中的 rompt

(2)-o 代表 Optimize

 

 

大表优化

1、限定查询的范围,禁止不带任何限制数据范围条件的查询语句

2、读写分离

(1)主库负责写,从库负责读

(2)一主一从模式

image-20220606115040891

(2)双主双从模式:

image-20220606115056454

3、垂直拆分

(1)如果数据库中的数据表过多,可以采用垂直分库的方式,将关联的数据表部署在同一个数据库上

(2)如果数据表中的列过多,可以采用垂直分表的方式,将一张数据表分拆成多张数据表,把经常一起使用的列放到同一张表里

(3)优点:可以使得列数据变小,在查询时减少读取的 Block 数,减少 I/O 次数,此外,垂直分区可以简化表的结构,易于维护

(4)缺点:主键会出现冗余,需要管理冗余列,并会引起 JOIN 操作,让事务变得更加复杂

4、水平拆分

(1)尽量控制单表数据量的大小,建议控制在 1000 万以内,过大会造成修改表结构、备份、恢复存在问题

(2)可以使用历史数据归档(应用于日志数据),水平分表(应用于业务数据)等手段来控制数据量大小

(3)将大的数据表按照某个属性维度,拆分成不同的小表,每张小表保持相同的表结构

(4)水平分表仅解决单一表数据过大的问题,不提升 MySQL,所以水平拆分最好分库,从而达到分布式的目的

(5)水平拆分能够支持非常大的数据量存储,应用端改造少,但分片事务难以解决,跨节点 Join

(6)必须分片情况下,尽量选择客户端分片架构,可以减少一次和中间件的网络 I/O

5、数据库分片的两种常见方案

(1)客户端代理:分片逻辑在应用端,封装在 jar 包中,通过修改或者封装 JDBC 层来实现

(2)中间件代理:在应用和数据中间加一个代理层,分片逻辑统一维护在中间件服务中

 

服务器语句超时处理

1、在 MySQL 8.0 可以设置服务器语句超时的限制,单位可以达到毫秒级别

2、当中断的执行语句超过设置的毫秒数后,服务器将终止查询影响不大的事务或连接,然后将错误报给客户端

3、通过设置系统变量 MAX_EXECUTION_TIME 实现

#设置全局超时时间
SET GLOBAL MAX_EXECUTION_TIME=2000;
#指定该会话中SELECT语句的超时时间
SET SESSION MAX_EXECUTION_TIME=2000;

4、默认情况下,MAX_EXECUTION_TIME 值为 0

 

创建全局通用表空间

1、MySQL 8.0 使用 CREATE TABLESPACE 创建一个全局通用表空间

CREATE TABLESPACE 表空间名
ADD DATAFILE '文件名'
[FILE_BLOCK_SIZE = value]
[ENGINE [=] engine_name]

2、全局表空间可以被所有的数据库的表共享,而且相比于独享表空间,使用手动创建共享表空间可以节约元数据方面的内存

3、可以在创建表时,指定属于哪个表空间,也可以对已有表进行表空间修改,只需在语句尾加 TABLESPACE 表空间名

4、删除通用表空间

DROP TABLESPACE 表空间名;

(1)如果依赖该共享表空间的表存在,就会删除失败:Tablespace `表空间名` is not empty

 

MySQL 8.0 新特性:隐藏索引对调优的帮助

1、在MySQL 8.0 中,索引可以被隐藏和显示

2、当一个索引被隐藏时,它不会被查询优化器所使用

3、需要注意的是当索引被隐藏时,它的内容仍然是和正常索引一样实时更新,如果一个索引需要长期被隐藏,那么可以将其删除,因为索引的存在会影响插入、更新、删除的性能

4、数据表中的主键不能被设置为 invisible

posted @   半条咸鱼  阅读(143)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示