MySQL 到底能不能online ddl index PG VS MYSQL
开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2350人左右 1 + 2 + 3 + 4 +5 + 6)5群接近480 已经停止申请,新人将进入6群
上周一篇关于MySQL 拜托加个索引能和PG一样简单吗?只能gh-ost了 烦人,的帖子引起争议,主要因为我提到 POSTGRESQL 在线添加索引是非常方便的,MySQL 在这方面不咋地,首先说结果,我对MYSQL的知识需要更新,针对高版本得MYSQL是支持online ddl index,所以写这篇来纠正一下,但是有一些同学发了一些MYSQL 支持online ddl index 的绝对论甚至有人说mysql 5.x就可以onine ddl index,这点咱们也的纠正,对就是对,错就是错。
先说结论,高版本的MySQL可以进行online ddl index是在8.023版本以上的MySQL 而在MySQL 8.023 版本以下的MySQL没有默认使用 online ddl index 的功能或根本没有,使用create index on 的语句来建立索引,是会直接给表加锁,并且阻碍任何事务的运行,所以如果是8.023 的版本或以上的MYSQL那么我是错的,但在这个版本以下的mysql,我们是需要继续使用pt-osc, or gh-osc 工具来添加索引的(大表)。
给我反馈我说错的同学(感谢一位叫Mong的同学),当然还有其他在文章下面留言的同学,这位叫Mong的同学非常细心的对 ONLINE DDL INDEX 进行了工作和解释,并截图给我,同时他也发现版本的问题和即使支持也是有条件的支持,然后就有了此篇文章。的确从8.023版本已经默认引入了 online ddl add index 的功能。并且我也亲测在8.030上的确在存储过程疯狂的插入数据的情况下,建立索引删除都是OK 的,没有问题不会锁表,DML和index add drop之间是不存在锁表而导致DML无法进行的情况,所有说8.023 以后的版本不可以ONLINE DDL INDEX 是不对的。
那么8.023以上的版本有多少人再用,这是一个问题,同时有多少人知道这个事情,也是问题。另外8.023以下的版本,通过alter table 语句添加参数是否也可以进行在线的online ddl index 是需要通过 algorithm=inplace 和lock 的模式调整来降低添加索引锁定的时间,这点有多少人知道并且这和MYSQL8.023版本的online ddl index 是一回事吗?????
让我不解的是上篇帖子出来,马上就有人反馈,不对MYSQL 5.7 就可以DDL INDEX ONLINE 的同学,拜托不要在人云亦云了The proof of the pudding is in the eating!
下面是证实在MYSQL8.030 在线加索引是否可以,答案是可以
mysql> <br>mysql> CREATE PROCEDURE generate_data()<br> -> BEGIN<br> -> DECLARE i INT DEFAULT 1;<br> -> DECLARE practice_time TIMESTAMP;<br> -> <br> -> CREATE TABLE generated_table (<br> -> id INT PRIMARY KEY AUTO_INCREMENT,<br> -> text_field VARCHAR(255),<br> -> practice_field TIMESTAMP<br> -> );<br> -> <br> -> SET practice_time = NOW();<br> -> <br> -> WHILE i INSERT INTO generated_table (text_field, practice_field) VALU<br> -> SET practice_time = practice_time + INTERVAL 1 SECOND;<br> -> SET i = i + 1;<br> -> END WHILE;<br> -> END //<br>Query OK, 0 rows affected (0.01 sec)<br><br>mysql> <br>mysql> DELIMITER ;<br>mysql> <br>mysql> CALL generate_data();<br><br>