加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

怎么测试MySQL8.0.16秒加字段 性能

发布时间:2023-08-24 13:31:53 所属栏目:MySql教程 来源:
导读:这篇文章主要讲解了“怎么测试MySQL8.0.16秒加字段功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么测试MySQL8.0.16秒加字段功能”

这篇文章主要讲解了“怎么测试MySQL8.0.16秒加字段功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么测试MySQL8.0.16秒加字段功能”吧!

Instant add column功能自MySQL 8.0.12版本引入,INSTANT操作仅修改数据字典中的元数据。在准备和执行期间,

不会在表上采用独占元数据锁,并且表数据不受影响,从而使操作立即生效。允许并发DML。

InnoDB仅支持INSTANT进行如下操作:

Change index option                       更改索引选项

Rename table (in ALTER way)                   重命名表(以ALTER方式)

SET/DROP DEFAULT                        设置/删除缺省值

Add columns(non-generated) – We call this instant ADD COLUMN  添加列(非生成) - 我们称之为立即加列

MODIFY COLUMN                          修改列

Add/drop virtual columns                    添加/删除虚拟列

添加新列作为表中的最后一列。

添加生成的虚拟列。

删除生成的虚拟列。

设置现有列的默认值。

删除现有列的默认值。

更改具有ENUM或SET数据类型的列所允许的值列表。要求是列的存储大小不会更改。

instant功能存在的限制:

仅支持在一个语句中添加列,即如果同一语句中存在其他非INSTANT操作,则无法立即执行

innodb行格式不能是COMPRESSED。

该表上不能有全文索引。

即时添加的列不能是PK。

只能顺序加列,仅支持在最后添加列,而不支持在现有列的中间添加列

不支持压缩表

不支持包含任何全文索引的表

不支持临时表,临时表只能使用copy的方式执行DDL

不支持那些在数据词典表空间中创建的表

数据字典中的表不能使用instant算法

实验如下:

mysql> CREATE TABLE `test` (

  -> `ID` int(11) NOT NULL AUTO_INCREMENT,

  -> `NAME` varchar(50) NOT NULL,

  -> PRIMARY KEY (`ID`)

  -> ) AUTO_INCREMENT=1000;

Query OK, 0 rows affected (0.19 sec)

mysql>delimiter $$

mysql> create procedure pro_test()

  ->   begin

  ->   declare id int;

  ->   set id = 100000;

  ->   while id>0 do

  ->   insert into test(name) values ('love');  

  ->   set id = id-1;                                                                        

  ->   end while;

  ->   end $$

Query OK, 0 rows affected (0.04 sec)

mysql>delimiter ;

mysql>call pro_test();

mysql>call pro_test();

mysql>call pro_test();

mysql>call pro_test();

mysql>call pro_test();

mysql>call pro_test();

mysql>call pro_test();

多执行几次,生成更多的数据量。

mysql>select count(*) from test;

+----------+

| count(*) |

+----------+

| 20547289 |

+----------+

1 row in set (1 min 6.85 sec)

秒加字段测试:

mysql>alter table test add addr varchar(10),ALGORITHM=INSTANT;

Query OK, 0 rows affected (4.06 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql>ALTER TABLE test ADD COLUMN c ENUM('a', 'b', 'c'), ALGORITHM = INSTANT;

Query OK, 0 rows affected (0.12 sec)

Records: 0 Duplicates: 0 Warnings: 0

第一次用了4.06秒,第二次用了0.12秒

重命名:

mysql>ALTER TABLE test RENAME TO t2, ALGORITHM = INSTANT;

Query OK, 0 rows affected (0.19 sec)

mysql>ALTER TABLE t2 RENAME TO test, ALGORITHM = INSTANT;

Query OK, 0 rows affected (0.10 sec)

设置列缺省值:

mysql>ALTER TABLE test ALTER COLUMN name SET DEFAULT 100, ALGORITHM = INSTANT;

Query OK, 0 rows affected (0.09 sec)

Records: 0 Duplicates: 0 Warnings: 0

删除列缺省值:

mysql>ALTER TABLE test alter COLUMN name DROP DEFAULT, ALGORITHM = INSTANT;

Query OK, 0 rows affected (0.13 sec)

Records: 0 Duplicates: 0 Warnings: 0

修改列:

mysql>ALTER TABLE test MODIFY COLUMN c ENUM('a', 'b', 'c', 'd', 'e'), ALGORITHM=INSTANT;

Query OK, 0 rows affected (0.09 sec)

Records: 0 Duplicates: 0 Warnings: 0

更改索引,适用于表上已有索引:

mysql>>show index from test \G

*************************** 1. row ***************************

    Table: test

  Non_unique: 0

   Key_name: PRIMARY

 Seq_in_index: 1

 Column_name: ID

  Collation: A

 Cardinality: 19998192

   Sub_part: NULL

    Packed: NULL

     Null: 

  Index_type: BTREE

   Comment: 

Index_comment: 

   Visible: YES

  Expression: NULL

*************************** 2. row ***************************

    Table: test

  Non_unique: 1

   Key_name: name

 Seq_in_index: 1

 Column_name: NAME

  Collation: A

 Cardinality: 1

   Sub_part: NULL

    Packed: NULL

     Null: 

  Index_type: BTREE

   Comment: 

Index_comment: 

   Visible: YES

  Expression: NULL

2 rows in set (0.04 sec)

mysql>ALTER TABLE test DROP index name, ADD index name(name),ALGORITHM = INSTANT;

Query OK, 0 rows affected (0.13 sec)

Records: 0 Duplicates: 0 Warnings: 0

但在其他无索引的列上加新索引是不支持的:

mysql>alter table test ADD index addr(addr),ALGORITHM = INSTANT;

ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported for this operation. 

Try ALGORITHM=COPY/INPLACE.

增加虚拟列:

ALTER TABLE test ADD COLUMN (d INT GENERATED ALWAYS AS (1 + 1) VIRTUAL), ALGORITHM = INSTANT;

Query OK, 0 rows affected (2.83 sec)

Records: 0 Duplicates: 0 Warnings: 0

ysql>desc test;

+-------+---------------------------+------+-----+---------+-------------------+

| Field | Type           | Null | Key | Default | Extra       |

+-------+---------------------------+------+-----+---------+-------------------+

| ID  | int(11)          | NO  | PRI | NULL  | auto_increment  |

| NAME | varchar(50)        | NO  |   | NULL  |          |

| addr | varchar(10)        | YES |   | NULL  |          |

| ip  | int(11)          | YES |   | NULL  |          |

| c   | enum('a','b','c','d','e') | YES |   | NULL  |          |

| d   | int(11)          | YES |   | NULL  | VIRTUAL GENERATED |

+-------+---------------------------+------+-----+---------+-------------------+

删除虚拟列:

mysql>ALTER TABLE test DROP COLUMN d, ALGORITHM = INSTANT;

Query OK, 0 rows affected (0.48 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql>desc test;

+-------+---------------------------+------+-----+---------+----------------+

| Field | Type           | Null | Key | Default | Extra     |

+-------+---------------------------+------+-----+---------+----------------+

| ID  | int(11)          | NO  | PRI | NULL  | auto_increment |

| NAME | varchar(50)        | NO  | MUL | NULL  |        |

| addr | varchar(10)        | YES |   | NULL  |        |

| ip  | int(11)          | YES |   | NULL  |        |

| c   | enum('a','b','c','d','e') | YES |   | NULL  |        |

+-------+---------------------------+------+-----+---------+----------------+

5 rows in set (0.04 sec)

但删除普通列不支持:

mysql>ALTER TABLE test DROP c, ALGORITHM = INSTANT;

ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported for this operation.

 Try ALGORITHM=COPY/INPLACE.

另外,用户还可以通过来自information_schema的视图观察即时ADD COLUMN的结果:

mysql>SELECT table_id, name, instant_cols FROM information_schema.innodb_tables WHERE name LIKE 'test%';

+----------+----------------+--------------+

| table_id | name      | instant_cols |

+----------+----------------+--------------+

|   1060 | test/child   |      0 |

|   1064 | test/t1    |      0 |

|   1065 | test/tbl    |      0 |

|   1068 | test/employees |      0 |

|   1072 | test/test_null |      0 |

|   1073 | test/test   |      2 |

+----------+----------------+--------------+

6 rows in set (0.00 sec)

感谢各位的阅读,以上就是“怎么测试MySQL8.0.16秒加字段功能”的内容了,经过本文的学习后,相信大家对怎么测试MySQL8.0.16秒加字段功能这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章