避免innodb plugin创建非聚簇索引时阻塞查询的一种方法

Innodb plugin在增删二级索引的时候不再拷贝数据,在删除一个secondary indexes时,先更改一下InnoDB内部数据字典和MySQL的数据字典,然后把释放的空间归还给InnoDB以供重复使用。如果是增加一个secondary indexes,还是有点复杂的,Plugin先将数据表中的数据取出到memory buffers或者临时表中,并按照新建索引列排好序,然后建立索引的B-Tree,但是在一些较低版本中出现了bug,导致select也会被阻塞,这对于你的应用来说如果ddl期间不能查询,那将是一个恶梦,这个时候如果你需要添加索引,将要转变一下了,请看下面的实验:

root@test 05:18:05>desc test_plg;

+——-+————-+——+—–+———+—————-+

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

+——-+————-+——+—–+———+—————-+

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

| name  | varchar(30) | YES  |     | NULL    |                |

| dd    | datetime    | YES  |     | NULL    |                |

| dd2   | datetime    | YES  |     | NULL    |                |

| name2 | varchar(30) | YES  |     | NULL    |                |

+——-+————-+——+—–+———+—————-+

5 rows in set (0.00 sec)

root@test 05:18:12>show index from test_plg;

+———-+————+———-+————–+————-+———–+————-+———-+——–+——+————+———+

| Table    | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |

+———-+————+———-+————–+————-+———–+————-+———-+——–+——+————+———+

| test_plg |          0 | PRIMARY  |            1 | id          | A         |     6291866 |     NULL | NULL   |      | BTREE      |         |

+———-+————+———-+————–+————-+———–+————-+———-+——–+——+————+———+

1 row in set (0.10 sec)

test1:

Session1:

root@test 05:18:18>alter table test_plg add index ind_name(name);

Query OK, 0 rows affected (46.39 sec)

Records: 0  Duplicates: 0  Warnings: 0

Session2:

roo@test 05:15:46>select * from test_plg where;

+—-+———+———————+———————+——-+

| id | name    | dd                  | dd2                 | name2 |

+—-+———+———————+———————+——-+

|  1 | ssdsdsd | 2011-03-07 22:03:26 | 2011-03-07 22:03:26 | NULL  |

+—-+———+———————+———————+——-+

1 row in set (42.14 sec)

Session2被阻塞了:(

test2:

Session1:

root@test 05:18:18>alter table test_plg add index ind_name(name);

Query OK, 0 rows affected (46.39 sec)

Records: 0  Duplicates: 0  Warnings: 0

root@test 05:22:11>alter table test_plg add index ind_name(name),

drop column dd,add column dd datetime;

Query OK, 6291456 rows affected (1 min 35.12 sec)

Records: 6291456  Duplicates: 0  Warnings: 0

Session2:

roo@test 05:22:15>select * from test_plg where;

+—-+———+———————+———————+——-+

| id | name    | dd                  | dd2                 | name2 |

+—-+———+———————+———————+——-+

|  1 | ssdsdsd | 2011-03-07 22:03:26 | 2011-03-07 22:03:26 | NULL  |

+—-+———+———————+———————+——-+

1 row in set (0.00 sec)

Session2没有被阻塞^_^

总结:

Session2没有被阻塞^_^,但是创建索引的时间变长了:(;

将变通了的ddll语句(删除表中已有的列删除后在添加上:drop column dd,add column dd datetime),通过show global status看到

Innodb_rows_read   212673524 【由206382068变为212673524  】 –plugin失效,需要拷贝表;

而单独添加索引ddl的sql语句,通过show global status查看: Innodb_rows_read  仍为212673524  —plugin生效,不在拷贝表;

可以看到变通添加索引的方法,需要将原表要拷贝一遍,速度将会变慢许多, 但是可以避免应用查询被阻塞。

时间: 2024-10-31 04:40:52

避免innodb plugin创建非聚簇索引时阻塞查询的一种方法的相关文章

创建网页背景材质时常用到的4种方法

在网页设计中创建背景材质通常是根据设计方向展开设计的第一步,也是确定设计基调的重要环节.虽然大多数情况下,网页背景材质是非常细微和低调的,但是由于整个背景的范围较大,所以会给人强烈的心理感受.所以这篇文章中,我会就网页背景材质创建过程中常用到的方法做一总结,希望对于大家在设计中的开头步骤能够给与帮助的参考. 一.使用现成的图案来创建网页背景材质. 1.下载现成的图案样式,或者自己动手创建图案,关于如何自己创建图案,之前我写的一篇文章<在http://www.aliyun.com/zixun/ag

创建吸引访问者的网站内容的14种方法

When I surf the Net, I often see web sites filled with beautiful graphics that strive to capture my attention. Well, they do so for an instant, however I click away when I don't immediately find relevant content. The content you add to your web site

Android编程创建桌面快捷方式的常用方法小结【2种方法】

本文实例讲述了Android编程创建桌面快捷方式的常用方法.分享给大家供大家参考,具体如下: Android在桌面上生成快捷方式有两种情况,一种是直接在桌面直接生成;一种是长按桌面,在弹出的快捷菜单中生成. 谈谈在桌面上直接生成.个人觉得这个比较爽快,既然都是快捷方式了干嘛还要再隐藏一层呢?当然喜欢桌面干净的就比较喜欢第二个了. 第一个是通过广播(Broadcast)的形式向Luncher发送请求生成快捷方式的. 在网上找到关于这方面的注册信息. <!--设置wallpapaer的activit

关闭时刷新父窗口两种方法_javascript技巧

window.opener.location.reload()刷新父窗口window.opener.location.reload() 与 window.opener.location.href=window.opener.location.href 都是弹出窗口关闭时用来刷新父窗口. 但window.location.Reload 如果有数据提交的动作,会提示是否提交的(是和否选项) window.opener.location.href=window.opener.location.href

实现非阻塞套接字的一种简单方法 使用 JSSE 和 NIO 实现非阻塞通信的一种快速方法

简介: 尽管 SSL 阻塞操作――当读写数据的时候套接字的访问被阻塞――与对应的非阻塞方式相比提供了更好的 I/O 错误通知,但是非阻塞操作允许调用的线程继续运行.本文中,作者同时就客户端和服务器端描述了如何使用Java Secure Socket Extensions (JSSE) 和 Java NIO (新 I/O)库创建非阻塞的安全连接,并且介绍了创建非阻塞套接字的传统方法,以及使用JSSE 和 NIO 的一种可选的(必需的)方法. 阻塞,还是非阻塞?这就是问题所在.无论在程序员的头脑中多

创建PPT课件章节页的4种方法

很久没有出PPT课件制作的教程,实在是对不起广大老师和需要PPT课件制作技巧的朋友,在热心网友的一再催促下,这期为大家选用了蝇子老师的创建精彩PPT课件章节页的4种方法来讲解给大家,望大家细细品尝,上菜咯. 只要你会制作PPT,利用快速课件工具,如Articulate presenter等快速软件你可以轻松的制作出一门符合标准的课件,课件设计对于一些非技术人员来说已经变的如此简单.那我做完PPT直接转成课件不就行了,这种想法不是不可以,只是缺少了必要的元素. 一个完整的PPT课件结构一般包括以下

linux驱动-linux下写驱动控制gpio时的两种方法区别

问题描述 linux下写驱动控制gpio时的两种方法区别 linux下写驱动控制gpio时,见过两种方法: 用request_mem_region函数和ioremap等得到控制寄存器的地址,然后用iowrite32函数控制该gpio 用gpio_request 和 gpio_set_value函数来控制gpio引脚 请问:这两种方法有什么区别,分别适用什么场合? 解决方案 http://blog.csdn.net/mirkerson/article/details/8464290http://b

聚簇索引与非聚簇索引的区别以及SQL Server查询优化技术

server|区别|索引|优化 在<数据库原理>里面,对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索引顺序与数据物理排列顺序无关.正式因为如此,所以一个表最多只能有一个聚簇索引. 不过这个定义太抽象了.在SQL Server中,索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点.而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块.如下图: 非聚簇索引 聚簇索引 聚簇索引与非聚簇索引的本质区别到底是什么?

如何在 Fireworks 8 中创建非矩形切片

创建 创建非矩形切片 当试图将交互性附加到非矩形图像时,矩形切片可能无法满足需要.例如,如果打算将变换图像行为附加到切片,而切片对象互相重叠或者形状不规则,则矩形切片可能会与交换图像交换出非您所要的背景图形.Fireworks 解决此问题的方法是:允许您使用"多边形切片"工具绘制任何多边形形状的切片. 您也可以在矢量路径的顶部插入切片,以便创建不规则的切片形状. 若要绘制多边形切片对象: 选择"多边形切片"工具. 单击以放置多边形的矢量点."多边形切片&q