数据库其它调优策略
定位调优方式
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)完成读操作
(4)数据分片:把一个数据库切成多份,放到不同的数据库服务器上,减少对单一数据库服务器的访问压力,MySQL 自带分区表功能,可以自己做垂直拆分(分库)、水平拆分(分表)、垂直 + 水平拆分(分库分表),提升数据库性能,同时增加维护和使用成本
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)一主一从模式
(2)双主双从模式:
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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战