避免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生效,不在拷贝表;

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

目录
相关文章
|
6月前
|
存储 算法 关系型数据库
深入理解InnoDB索引数据结构和算法
1. **索引定义**:索引是提升查询速度的有序数据结构,帮助数据库系统快速找到数据。 2. **索引类型**:包括普通索引、唯一索引、主键索引、空间索引和全文索引,每种有特定应用场景。 3. **数据结构**:InnoDB使用B+树作为索引结构,确保所有节点按顺序排列,降低查询时的磁盘I/O。 4. **B+树特性**:所有数据都在叶子节点,非叶子节点仅存储索引,提供高效范围查询。 5. **索引优势**:通过减少查找数据所需的磁盘I/O次数,显著提高查询性能。 **总结:**InnoDB索引通过B+树结构,优化了数据访问,使得查询速度快,尤其适合大数据量的场景。
374 0
深入理解InnoDB索引数据结构和算法
|
6月前
|
存储 关系型数据库 MySQL
索引大战:探秘InnoDB数据库中B树和Hash索引的优劣
索引大战:探秘InnoDB数据库中B树和Hash索引的优劣
65 0
|
5天前
|
存储 算法 关系型数据库
InnoDB与MyISAM实现索引方式的区别
InnoDB和MyISAM均采用B+树索引,但在实现上有所不同。InnoDB的主键索引在叶子节点存储完整数据记录,辅助索引则存储主键值;而MyISAM的主键索引与数据文件分离,仅存数据地址,且主辅索引无区别,支持非唯一主索引。
17 1
|
6月前
|
存储 SQL 关系型数据库
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
82 1
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
|
6月前
|
存储 算法 关系型数据库
InnoDb行格式、数据页结构、索引底层原理和如何建立索引
InnoDb行格式、数据页结构、索引底层原理和如何建立索引
118 0
|
存储 关系型数据库 MySQL
6.2.2 【MySQL】InnoDB中的索引方案
6.2.2 【MySQL】InnoDB中的索引方案
83 0
|
关系型数据库 MySQL 数据库
InnoDB事务和锁定信息:如何识别和解决阻塞查询问题
InnoDB事务和锁定信息:如何识别和解决阻塞查询问题
|
存储 关系型数据库 MySQL
6.2.3 【MySQL】InnoDB的B+树索引的注意事项
6.2.3 【MySQL】InnoDB的B+树索引的注意事项
82 0
|
16天前
|
SQL 关系型数据库 MySQL
|
5月前
|
存储 关系型数据库 MySQL
【MySQL技术内幕】5.1-InnoDB存储引擎索引概述
【MySQL技术内幕】5.1-InnoDB存储引擎索引概述
58 0